来自 Wearable.DataApi.getDataItem 的空数据项

Null Data Item From Wearable.DataApi.getDataItem

我的可穿戴设备有一个 Activity implements DataApi.DataListener,这个 ActivityonConnected() 中向手持设备发送一条消息以更新请求的数据。当手持设备收到此消息时,它会从服务器获取数据,并将其传递给 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。为什么它给我一个空项目?

在手表设备上,为什么要获取 localNode 并使用它构建 dataUri?创建 DataItem 时,其 Uri 包含创建者的 nodeId,因此如果您在移动设备上添加数据项,其 uri 包含移动设备的 nodeId 因此当您想要在不同节点上搜索这些项目时,您应该使用创建者的 nodeId(在您的情况下为移动设备),而不应使用接收者的本地 nodeId 来构建您的 uri,请参阅 JavaDoc. In many cases, you don't know the id of the creator, so you would use getDataItems() with partial uri,仅从路径构建。另外,最好使用 onDataChanged() 回调,然后根据路径过滤消息。