Android 磨损数据层 PutDataMapRequest 不起作用
Android wear data layer PutDataMapRequest doesn't work
我正在尝试实施 android wear 应用程序。我想我不明白什么,因为我的测试项目表现得很奇怪。这是一个非常简单的项目 - activity 在移动设备上有两个按钮("Send map" 和 "Send message"),在可穿戴设备上有 WearableListenerService,它会在收到数据时创建通知。
现在,当我尝试通过 Wearable.DataApi 发送数据时,可穿戴设备上没有任何反应 - 数据已发送,但可穿戴设备上没有任何反应(可穿戴设备一直与移动设备耦合)。我试着等了 10-15 分钟,但仍然没有。但是,如果我随后通过 MessageApi 发送数据,消息会立即传送,并且我通过 DataApi 发送的所有数据项也会在那个时刻收到。
当我尝试 google 使用 DataApi(DataLayer 或 Quiz)的示例时,数据项似乎几乎是即时交付的,但几乎所有示例都使用 DataApi 和 MessageApi。
此外,如果我在发送数据项后启动这些示例之一,我发送的所有项目也会被传送。
所以我想我的问题是:是否是我的代码中的错误导致数据项无法传送?或者它应该像这样工作并且数据项只是在设备上累积,并且实际交换正在发生,例如,每隔一小时左右,发送消息是触发立即传递的唯一方法?
这是我的数据项发送代码:
String data = String.valueOf(System.currentTimeMillis());
PutDataMapRequest pdmr = PutDataMapRequest.create("/wear_test/"+data);
pdmr.getDataMap().putString("1", data);
PutDataRequest pdr = pdmr.asPutDataRequest();
Wearable.DataApi.putDataItem(googleApiClient,pdr);
监听服务代码如下:
public class ListenerService extends WearableListenerService {
private static final String TAG = ListenerService.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "Service created");
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
super.onDataChanged(dataEvents);
Log.e(TAG, "onDataChanged(DataEventBuffer dataEvents) is called");
for (DataEvent dataEvent : dataEvents) {
Log.e(TAG, "Event type: "+dataEvent.getType()+", Uri:'"+dataEvent.getDataItem().getUri());
if(dataEvent.getType()==DataEvent.TYPE_CHANGED && dataEvent.getDataItem().getUri().getPath().contains("/wear_test")){
DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
String data = dataMap.getString("1");
Log.e(TAG, "Data received: " + data);
createNotification(data,505, "data map");
}
}
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
super.onMessageReceived(messageEvent);
if (messageEvent.getPath().contains("wear_test")){
String messageStr = new String(messageEvent.getData(), Charset.forName("UTF-8"));
Log.e(TAG, "Message received:"+messageStr);
createNotification(messageStr,808, "message");
}
}
private void createNotification(String data, int notificationCode, String suffix){
Notification notification = new Notification.Builder(this)
.setTicker(data)
.setSmallIcon(R.drawable.common_google_signin_btn_icon_light)
.setContentText(data+"\n"+suffix)
.setSubText(data+"\n"+suffix)
.build();
((NotificationManager) getSystemService(NOTIFICATION_SERVICE))
.notify(notificationCode, notification);
}
}
我遇到了同样的问题。我使用 PutDataRequest.setUrgent() 解决了它。
来自文档:
DataItems will be delayed no longer than 30 minutes, subject to a connected peer, but are expected to arrive much sooner.
Clients should only setUrgent() for DataItems which need to be delivered right away.
我正在尝试实施 android wear 应用程序。我想我不明白什么,因为我的测试项目表现得很奇怪。这是一个非常简单的项目 - activity 在移动设备上有两个按钮("Send map" 和 "Send message"),在可穿戴设备上有 WearableListenerService,它会在收到数据时创建通知。
现在,当我尝试通过 Wearable.DataApi 发送数据时,可穿戴设备上没有任何反应 - 数据已发送,但可穿戴设备上没有任何反应(可穿戴设备一直与移动设备耦合)。我试着等了 10-15 分钟,但仍然没有。但是,如果我随后通过 MessageApi 发送数据,消息会立即传送,并且我通过 DataApi 发送的所有数据项也会在那个时刻收到。
当我尝试 google 使用 DataApi(DataLayer 或 Quiz)的示例时,数据项似乎几乎是即时交付的,但几乎所有示例都使用 DataApi 和 MessageApi。
此外,如果我在发送数据项后启动这些示例之一,我发送的所有项目也会被传送。
所以我想我的问题是:是否是我的代码中的错误导致数据项无法传送?或者它应该像这样工作并且数据项只是在设备上累积,并且实际交换正在发生,例如,每隔一小时左右,发送消息是触发立即传递的唯一方法?
这是我的数据项发送代码:
String data = String.valueOf(System.currentTimeMillis());
PutDataMapRequest pdmr = PutDataMapRequest.create("/wear_test/"+data);
pdmr.getDataMap().putString("1", data);
PutDataRequest pdr = pdmr.asPutDataRequest();
Wearable.DataApi.putDataItem(googleApiClient,pdr);
监听服务代码如下:
public class ListenerService extends WearableListenerService {
private static final String TAG = ListenerService.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "Service created");
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
super.onDataChanged(dataEvents);
Log.e(TAG, "onDataChanged(DataEventBuffer dataEvents) is called");
for (DataEvent dataEvent : dataEvents) {
Log.e(TAG, "Event type: "+dataEvent.getType()+", Uri:'"+dataEvent.getDataItem().getUri());
if(dataEvent.getType()==DataEvent.TYPE_CHANGED && dataEvent.getDataItem().getUri().getPath().contains("/wear_test")){
DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
String data = dataMap.getString("1");
Log.e(TAG, "Data received: " + data);
createNotification(data,505, "data map");
}
}
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
super.onMessageReceived(messageEvent);
if (messageEvent.getPath().contains("wear_test")){
String messageStr = new String(messageEvent.getData(), Charset.forName("UTF-8"));
Log.e(TAG, "Message received:"+messageStr);
createNotification(messageStr,808, "message");
}
}
private void createNotification(String data, int notificationCode, String suffix){
Notification notification = new Notification.Builder(this)
.setTicker(data)
.setSmallIcon(R.drawable.common_google_signin_btn_icon_light)
.setContentText(data+"\n"+suffix)
.setSubText(data+"\n"+suffix)
.build();
((NotificationManager) getSystemService(NOTIFICATION_SERVICE))
.notify(notificationCode, notification);
}
}
我遇到了同样的问题。我使用 PutDataRequest.setUrgent() 解决了它。
来自文档:
DataItems will be delayed no longer than 30 minutes, subject to a connected peer, but are expected to arrive much sooner. Clients should only setUrgent() for DataItems which need to be delivered right away.