使用 DataMap 发送和接收数据 - Android 可穿戴设备
Send and Receiving Data using DataMap - Android Wearable
我正在开发一个 Android 可穿戴项目,我正在尝试将数据从移动设备发送到可穿戴模拟器。我正在尝试在可穿戴设备中记录接收到的数据,但它没有记录。
这些是我到目前为止所做的。
1) 打开Android Wear 应用,让模拟器状态变为"connected"
2) 连接我的移动设备
3) 运行 adb -d forward tcp:5601 tcp:5601 将移动设备与模拟器连接
4) 实施 GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,LocationListener 在我的移动设备中发送 class 并在 onCreate 中构建客户端:
googleClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
5) 在我的移动设备中,使用完美记录的“weatherDescription”创建一个数据项,我可以在其中使用 DataApi 通过 putDataItem 发送到可穿戴设备:
这是天气描述的日志:I/weatherDescription:散落的云层
putDataMapReq = PutDataMapRequest.create("/data");
Log.i("weatherDescription", weatherDescription);
putDataMapReq.getDataMap().putString("weatherDescription", weatherDescription);
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
Wearable.DataApi.putDataItem(googleClient, putDataReq);
5)实施GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,在我的可穿戴设备中接收 class(我的自定义表盘 class)中的 LocationListener,并在 onCreate 中构建客户端:
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));
}
});
}
receiving/wearable 端似乎连接正常:
I/myTag:状态{statusCode=SUCCESS,resolution=null}
7) 在onDataChanged中,记录收到的信息:
public void onDataChanged(DataEventBuffer dataEventBuffer) {
Log.i("myTag", "in on Data Changed");
for (DataEvent event : dataEventBuffer){
if(event.getType() == DataEvent.TYPE_CHANGED){
DataItem item = event.getDataItem();
if(item.getUri().getPath().compareTo("/data") == 0 ){
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
dataMap.getString("weatherDescription");
Log.i("myTag", dataMap.getString("weatherDescription"));
}
}
}
}
首先,尝试记录输入 DataItem
:
的结果
Wearable.DataApi.putDataItem(googleClient, putDataReq)
.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
Log.d(TAG, "putDataItem status: "
+ dataItemResult.getStatus().toString());
}
});
如果出现问题,dataItemResult.getStatus()
调用会告诉您。接下来,确保您正在收听 onDataChanged()
事件。在您的 Wear 应用 onConnected()
方法中,添加:
Wearable.DataApi.addListener(googleClient, yourListenerHere);
最后,要强制立即将数据发送到 Wear 设备,请使用 setUrgent()
:
putDataMapReq = PutDataMapRequest.create("/data").setUrgent();
希望对您有所帮助。
这里有一些线索:
关于你的第五点,试着把 setUrgent() 放在这里:
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest().setUrgent();
另外,如果回调成功,则表示数据发送成功。这并不意味着它被很好地接受了,或者被很好地接受了。
也许你做到了,但你是在 onStart() 还是在其他任何地方调用 googleClient.connect()
?
onDataChanged()只有当放入的数据确实不同时才会被调用,如果你一直在放入相同的数据,它不会被调用。要进行测试,您可以将 timestamp 添加到 DataMap。
您的手机和穿戴应用程序需要相同的包名才能交换messages/data。
也许您可以尝试实现一个 WearableListenerService 来接收 onDataChanged 上的数据。代码没有什么不同,只是这个服务是在接收到数据时创建的,所以你不必打开你的应用程序。确保在清单的此服务意图过滤器中添加 BIND_LISTENER 操作。
<service android:name=".AnalogWatchFaceConfigListenerService">
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
听起来你的 dataMap 没有改变它的值,那么它就不会向可穿戴设备发送数据。
您可以发送 Long.toString(System.currentTimeMillis())
进行验证,因为它每次都会更改。
我终于明白了。在表盘方面,我在 WeatherWatchFaceService class 中声明了 Google Api 客户端实例 mGoogleApiClient 而不是引擎 class.在我将它从 WeatherWatchFaceService 移至 Engine 后,手表端收到了我试图从手机发送的内容。
干杯。
我正在开发一个 Android 可穿戴项目,我正在尝试将数据从移动设备发送到可穿戴模拟器。我正在尝试在可穿戴设备中记录接收到的数据,但它没有记录。
这些是我到目前为止所做的。
1) 打开Android Wear 应用,让模拟器状态变为"connected"
2) 连接我的移动设备
3) 运行 adb -d forward tcp:5601 tcp:5601 将移动设备与模拟器连接
4) 实施 GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,LocationListener 在我的移动设备中发送 class 并在 onCreate 中构建客户端:
googleClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
5) 在我的移动设备中,使用完美记录的“weatherDescription”创建一个数据项,我可以在其中使用 DataApi 通过 putDataItem 发送到可穿戴设备:
这是天气描述的日志:I/weatherDescription:散落的云层
putDataMapReq = PutDataMapRequest.create("/data");
Log.i("weatherDescription", weatherDescription);
putDataMapReq.getDataMap().putString("weatherDescription", weatherDescription);
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
Wearable.DataApi.putDataItem(googleClient, putDataReq);
5)实施GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,在我的可穿戴设备中接收 class(我的自定义表盘 class)中的 LocationListener,并在 onCreate 中构建客户端:
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));
}
});
}
receiving/wearable 端似乎连接正常:
I/myTag:状态{statusCode=SUCCESS,resolution=null}
7) 在onDataChanged中,记录收到的信息:
public void onDataChanged(DataEventBuffer dataEventBuffer) {
Log.i("myTag", "in on Data Changed");
for (DataEvent event : dataEventBuffer){
if(event.getType() == DataEvent.TYPE_CHANGED){
DataItem item = event.getDataItem();
if(item.getUri().getPath().compareTo("/data") == 0 ){
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
dataMap.getString("weatherDescription");
Log.i("myTag", dataMap.getString("weatherDescription"));
}
}
}
}
首先,尝试记录输入 DataItem
:
Wearable.DataApi.putDataItem(googleClient, putDataReq)
.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
@Override
public void onResult(DataApi.DataItemResult dataItemResult) {
Log.d(TAG, "putDataItem status: "
+ dataItemResult.getStatus().toString());
}
});
如果出现问题,dataItemResult.getStatus()
调用会告诉您。接下来,确保您正在收听 onDataChanged()
事件。在您的 Wear 应用 onConnected()
方法中,添加:
Wearable.DataApi.addListener(googleClient, yourListenerHere);
最后,要强制立即将数据发送到 Wear 设备,请使用 setUrgent()
:
putDataMapReq = PutDataMapRequest.create("/data").setUrgent();
希望对您有所帮助。
这里有一些线索:
关于你的第五点,试着把 setUrgent() 放在这里:
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest().setUrgent();
另外,如果回调成功,则表示数据发送成功。这并不意味着它被很好地接受了,或者被很好地接受了。
也许你做到了,但你是在 onStart() 还是在其他任何地方调用
googleClient.connect()
?onDataChanged()只有当放入的数据确实不同时才会被调用,如果你一直在放入相同的数据,它不会被调用。要进行测试,您可以将 timestamp 添加到 DataMap。
您的手机和穿戴应用程序需要相同的包名才能交换messages/data。
也许您可以尝试实现一个 WearableListenerService 来接收 onDataChanged 上的数据。代码没有什么不同,只是这个服务是在接收到数据时创建的,所以你不必打开你的应用程序。确保在清单的此服务意图过滤器中添加 BIND_LISTENER 操作。
<service android:name=".AnalogWatchFaceConfigListenerService">
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
听起来你的 dataMap 没有改变它的值,那么它就不会向可穿戴设备发送数据。
您可以发送 Long.toString(System.currentTimeMillis())
进行验证,因为它每次都会更改。
我终于明白了。在表盘方面,我在 WeatherWatchFaceService class 中声明了 Google Api 客户端实例 mGoogleApiClient 而不是引擎 class.在我将它从 WeatherWatchFaceService 移至 Engine 后,手表端收到了我试图从手机发送的内容。
干杯。