使用DataMap发送和接收数据-Android可穿戴

使用DataMap发送和接收数据-Android可穿戴,android,wear-os,android-wear-data-api,Android,Wear Os,Android Wear Data Api,我正在从事一个Android可穿戴项目,我正在尝试将数据从移动设备发送到可穿戴模拟器。我正在尝试将收到的数据记录在可穿戴设备中,但它没有记录 这些就是我到目前为止所做的 1打开Android Wear应用程序以获取要连接的仿真器状态 2连接我的移动设备 3运行adb-d forward tcp:5601 tcp:5601将移动设备与仿真器连接 4实现GoogleAppClient.ConnectionCallbacks, GoogleAppClient.OnConnectionFailedLis

我正在从事一个Android可穿戴项目,我正在尝试将数据从移动设备发送到可穿戴模拟器。我正在尝试将收到的数据记录在可穿戴设备中,但它没有记录

这些就是我到目前为止所做的

1打开Android Wear应用程序以获取要连接的仿真器状态

2连接我的移动设备

3运行adb-d forward tcp:5601 tcp:5601将移动设备与仿真器连接

4实现GoogleAppClient.ConnectionCallbacks, GoogleAppClient.OnConnectionFailedListener,我的移动设备中发送类中的LocationListener,以及在onCreate中构建客户端:

    googleClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    googleClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
5在我的移动设备中,使用“weatherDescription”创建一个数据项,该数据项记录完美,我可以使用DataApi使用putDataItem向可穿戴设备发送:

这是weatherDescription:I/weatherDescription:Distributed clouds的日志

            putDataMapReq = PutDataMapRequest.create("/data");
            Log.i("weatherDescription", weatherDescription);
            putDataMapReq.getDataMap().putString("weatherDescription", weatherDescription);

            PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
            Wearable.DataApi.putDataItem(googleClient, putDataReq); 
5实现GoogleAppClient.ConnectionCallbacks, GoogleAppClient.OnConnectionFailedListener,接收类中的LocationListener,可穿戴设备中的My custom watchface类,以及onCreate中的building client:

    googleClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    googleClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
6在可穿戴设备的onConnect中设置侦听器:

@Override
public void onConnected(Bundle bundle) {

    Wearable.DataApi.addListener(mGoogleApiClient, this).setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(Status status) {
            Log.i("myTag", String.valueOf(status));
        }
    });
}

首先,尝试记录放置数据项的结果:

最后,要强制将数据立即发送到磨损装置,请使用SETERGENT:


希望有帮助。

首先,尝试记录放置数据项的结果:

最后,要强制将数据立即发送到磨损装置,请使用SETERGENT:

希望能有所帮助。

以下是一些线索:

关于你的第五点,试着在这里加上setUrgent:

PutDataRequest putDataReq=putDataMapReq.asPutDataRequest.setUrgent

此外,如果回调成功,则表示数据已成功发送。这并不意味着它受到了很好的欢迎,或者说受到了很好的欢迎

也许你打过,但是你会在onStart或其他地方打电话给googleClient.connect吗

onDataChanged仅在数据输入确实不同时调用,如果您eep输入相同的数据,则不会调用它。要进行测试,可以向数据映射添加时间戳

您的移动和穿戴应用程序需要具有相同的软件包名称,以便它们能够交换消息/数据

也许您可以尝试实现一个接收onDataChanged上的数据。代码没有什么不同,只是这项服务是在收到数据时创建的,所以你不必打开你的应用程序。请确保在清单上的此service intent筛选器中添加BIND_LISTENER操作

以下是一些潜在客户:

关于你的第五点,试着在这里加上setUrgent:

PutDataRequest putDataReq=putDataMapReq.asPutDataRequest.setUrgent

此外,如果回调成功,则表示数据已成功发送。这并不意味着它受到了很好的欢迎,或者说受到了很好的欢迎

也许你打过,但是你会在onStart或其他地方打电话给googleClient.connect吗

onDataChanged仅在数据输入确实不同时调用,如果您eep输入相同的数据,则不会调用它。要进行测试,可以向数据映射添加时间戳

您的移动和穿戴应用程序需要具有相同的软件包名称,以便它们能够交换消息/数据

也许您可以尝试实现一个接收onDataChanged上的数据。代码没有什么不同,只是这项服务是在收到数据时创建的,所以你不必打开你的应用程序。请确保在清单上的此service intent筛选器中添加BIND_LISTENER操作


听起来你的数据地图没有改变它的值,那么它就不会向可穿戴设备发送数据


您可以发送Long.toStringSystem.currentTimeMillis,以便在每次更改时进行验证

听起来你的数据地图没有改变它的值,那么它就不会向可穿戴设备发送数据


您可以发送Long.toStringSystem.currentTimeMillis,以便在每次更改时进行验证

我终于明白了。在watchface端,我在WeatherWatchFaceService类中声明了GoogleAPI客户端实例mgoogleAppClient,而不是Engine类。在我将它从WeatherWatchFaceService移动到Engine之后,手表端收到了我试图从手机发送的信息


干杯

我终于明白了。在watchface端,我在WeatherWatchFaceService类中声明了GoogleAPI客户端实例mgoogleAppClient,而不是Engine类。在我将它从WeatherWatchFaceService移动到Engine之后,手表端收到了我试图从手机发送的信息


干杯

谢谢你,里卡多。我执行了你的代码,看起来数据传输成功了:02-29 13:53:40.151 5686-5686/?D/myTag:putDataItem状态:状态{statusCode=SUCCESS,resolution=null}。我还将监听器添加到了可穿戴u

在我的帖子里更新。但我仍然没有在可穿戴/接收端看到日志。@BenWong您也使用了setUrgent吗?还有一件事,请尝试在每次创建数据映射时向其添加不同的值,如putDataMapRequest.getDataMap.putLongcurrent\u time,System.currentTimeMillis;。如果您输入的数据总是相同的,则不会更新。我确实使用了.setUrger,我还创建了一个不同的数据映射。我还在可穿戴端的onConnected中添加了一个回调,以记录代码中反映的连接状态,它显示为successful-status{statusCode=SUCCESS,resolution=null}。我没有选择,抱歉:找到解决方案后,请更新此帖子。我很想知道问题出在哪里。我克隆了您的回购协议并实现了.setUrgent方法。我还将log语句移出了循环,尽管这不重要。我可以用我的LG G手表打印日志。我查看了您的代码,并将其与几个存储库以及一些教程进行了比较,我觉得您的代码很好。我怀疑你的问题是由于模拟器。虽然我还不确定问题的根源到底是什么。谢谢里卡多。我执行了你的代码,看起来数据传输成功了:02-29 13:53:40.151 5686-5686/?D/myTag:putDataItem状态:状态{statusCode=SUCCESS,resolution=null}。我还在我的帖子中更新的可穿戴设备中添加了onConnected中的侦听器。但我仍然没有在可穿戴/接收端看到日志。@BenWong您也使用了setUrgent吗?还有一件事,请尝试在每次创建数据映射时向其添加不同的值,如putDataMapRequest.getDataMap.putLongcurrent\u time,System.currentTimeMillis;。如果您输入的数据总是相同的,则不会更新。我确实使用了.setUrger,我还创建了一个不同的数据映射。我还在可穿戴端的onConnected中添加了一个回调,以记录代码中反映的连接状态,它显示为successful-status{statusCode=SUCCESS,resolution=null}。我没有选择,抱歉:找到解决方案后,请更新此帖子。我很想知道问题出在哪里。我克隆了您的回购协议并实现了.setUrgent方法。我还将log语句移出了循环,尽管这不重要。我可以用我的LG G手表打印日志。我查看了您的代码,并将其与几个存储库以及一些教程进行了比较,我觉得您的代码很好。我怀疑你的问题是由于模拟器。虽然我还不确定问题的根源到底是什么,但以下是磨损数据和消息API无法提供的几个常见原因。我并不是在这一点上提出这个答案,但你在你的问题中没有提到这两个问题。软件包名称:手持应用程序和可穿戴APK签名都需要相同:同样,要交付数据,两侧都需要相同。最有可能的是,如果您直接从IDE运行这两者,这对您来说不是问题,但值得检查一下。我并不是在这一点上提出这个答案,但你在你的问题中没有提到这两个问题。软件包名称:手持应用程序和可穿戴APK签名都需要相同:同样,要交付数据,两侧都需要相同。最有可能的是,如果您直接从IDE运行这两者,这对您来说不是问题,但值得检查。谢谢@kaputer。尝试了所有这些,包括更改我的包名,在清单中添加bind_listener操作,以及在连接时在可穿戴端记录连接,从而记录成功。所以连接很好,发送数据也很好,只是接收不起作用。你的模拟器和手机是通过Android Wear应用程序连接的吗?您可以通过获取已连接节点的列表,在那里您可以知道您的手机是否可以看到您的模拟器。我可以看更多你的代码吗?您可以检查此android以与您的实现进行比较。这是我执行adb设备时的打印输出-设备连接列表ZX1G22GXBV设备模拟器-5554设备192.168.57.101:5555设备。看来事情是有联系的。但是如果你想查看它,这里有一个github。adb只查看当前存在哪些设备,它不知道它们是否相互连接。因此,如果你不在AndroidWear应用程序上手动连接模拟器和手机,它们将无法连接。也许你已经这么做了,但我不确定你最后的答案。根据我手机上的Android Wear应用程序,左上角显示Emulator已连接。谢谢,谢谢你。尝试了所有这些,包括更改我的包名,在清单中添加bind_listener操作,以及在连接时在可穿戴端记录连接,从而记录成功。所以连接是好的,
发送数据也很好,只是接收不起作用。你的模拟器和手机是通过Android Wear应用程序连接的吗?您可以通过获取已连接节点的列表,在那里您可以知道您的手机是否可以看到您的模拟器。我可以看更多你的代码吗?您可以检查此android以与您的实现进行比较。这是我执行adb设备时的打印输出-设备连接列表ZX1G22GXBV设备模拟器-5554设备192.168.57.101:5555设备。看来事情是有联系的。但是如果你想查看它,这里有一个github。adb只查看当前存在哪些设备,它不知道它们是否相互连接。因此,如果你不在AndroidWear应用程序上手动连接模拟器和手机,它们将无法连接。也许你已经这么做了,但我不确定你最后的答案。根据我手机上的Android Wear应用程序,左上角显示Emulator已连接。谢谢。你们帮我省了一个星期的时间,我的应用程序有时会向手机发送数据,但有时不会,直到阅读并尝试你们的代码,我才明白为什么。非常感谢您为我节省了一周的时间,我的应用程序有时会将数据发送到手机,有时不会,直到阅读并尝试您的代码,我才明白原因。非常感谢
Wearable.DataApi.addListener(googleClient, yourListenerHere);
putDataMapReq = PutDataMapRequest.create("/data").setUrgent();