0

我的可穿戴设备有一个Activityimplements DataApi.DataListener它会向手持设备Activity发送一条消息onConnected()以更新请求的数据。当手持设备收到此消息时,它会从服务器获取数据,并将其传递给DataMap. 这DataMap是使用以下代码发送的:

NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();

for(Node node : nodes.getNodes()) {
    PutDataMapRequest dataRequest = PutDataMapRequest.create(mPath);
    dataRequest.getDataMap().putDataMapArrayList("/path", mData);

    PutDataRequest request = dataMapRequest.asPutDataRequest();
    DataApi.DataItemResult result = Wearable.DataApi.putDataItem(mGoogleApiClient, request).await();

    if(result.getStatus().isSuccess()) {
        Log.d(TAG, "DataMap: " + mData + " sent to: " + node.getDisplayName());
    }
}

这段代码似乎可以正常工作,因为它输出到 logcat: "DataMap: <mData> sent to: 7f7fbd33"。然后手持AsyncTask式可穿戴设备使用以下代码接收此数据:

NodeApi.GetLocalNodeResult localNode =
    Wearable.NodeApi.getLocalNode(getGoogleApiClient()).await();
Uri dataUri = new Uri.Builder().scheme(PutDataRequest.WEAR_URI_SCHEME)
    .authority(localNode.getNode().getId()).path("/path").build();
Log.d(dataUri.toString());

DataApi.DataItemResult itemResult =
    Wearable.DataApi.getDataItem(mGoogleApiClient, dataUri).await();
Log.d(TAG, itemResult.getStatus() + " dataItem=" + dataItem.getDataItem();

if(itemResult.getStatus().isSuccess() && itemResult.getDataItem() != null) {
    ...
}

路径似乎是正确的: wear://7f7fbd33/path,但结果最终是: Status{statusCode=SUCCESS, resolution=null} dataItem=null。为什么它给我一个空项目?

4

1 回答 1

2

在手表设备上,为什么要获取 localNode 并使用它构造一个 dataUri?创建 DataItem 时,其 Uri 包含创建者的 nodeId,因此如果您在移动设备上添加数据项,则其 uri 包含移动设备的 nodeId,因此当您要在不同节点上搜索这些项目时,您应该使用创建者的 nodeId (在您的情况下是移动设备),并且不应该使用接收者的本地 nodeId 来构造您的 uri,请参阅JavaDoc。在许多情况下,您不知道创建者的 id,因此您将使用getDataItems () 和部分 uri,仅从路径构建。此外,最好使用 onDataChanged() 回调,然后根据消息的路径过滤消息。

于 2015-11-02T17:13:24.880 回答