使用DataMap发送和接收数据-Android可穿戴
我正在从事一个Android可穿戴项目,我正在尝试将数据从移动设备发送到可穿戴模拟器。我正在尝试将收到的数据记录在可穿戴设备中,但它没有记录 这些就是我到目前为止所做的 1打开Android Wear应用程序以获取要连接的仿真器状态 2连接我的移动设备 3运行adb-d forward tcp:5601 tcp:5601将移动设备与仿真器连接 4实现GoogleAppClient.ConnectionCallbacks, GoogleAppClient.OnConnectionFailedListener,我的移动设备中发送类中的LocationListener,以及在onCreate中构建客户端:使用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
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();