Android Wearable.DataApi.getDataItem中的空数据项

Android Wearable.DataApi.getDataItem中的空数据项,android,wear-os,android-wear-data-api,android-googleapiclient,Android,Wear Os,Android Wear Data Api,Android Googleapiclient,我的可穿戴设备有一个活动,它实现DataApi。DataListener,此活动向手持设备发送onConnected()中的消息,以更新请求的数据。当手持设备接收到此消息时,它从服务器获取数据,并将其传递到数据映射。此DataMap与以下代码一起发送: NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await(); for(Node node : node

我的可穿戴设备有一个
活动
,它
实现DataApi。DataListener
,此
活动
向手持设备发送
onConnected()
中的消息,以更新请求的数据。当手持设备接收到此消息时,它从服务器获取数据,并将其传递到
数据映射
。此
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:sent to:7f7fbd33”
。然后手持可穿戴设备在
异步任务中使用以下代码接收此数据:

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
,但结果是:
状态{statusCode=SUCCESS,resolution=null}dataItem=null
。为什么它会给我一个空项?

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

我有点困惑;第二个代码段仍在手持设备上运行?你是说手表吗?@AliNaddaf对不起,是的,我是说手表。你说的是部分Uri,如
wear:/path
?我已经试过了,省略了
.authority()
。类似这样:
Uri.Builder().scheme(PutDataRequest.WEAR\u Uri\u scheme).path(“/path”).build()
,但我得到了类似的结果<代码>状态{statusCode=ERROR,resolution=null}deataItem=null
。另外,
onDataChanged()
仅在数据实际更改时有效,并且我希望即使数据未更改也能获取数据。部分uri与getDataItem()不兼容,您应该使用getDataItems()才有效!我将代码切换到
DataItemBuffer results=Wearable.DataApi.getDataItems(mGoogleApiClient.await();DataMapItem dataMap=DataMapItem.fromDataItem(results.get(0))。非常感谢。现在有点粗糙,但至少我有一些东西要处理。@Bryan如果不检查结果,你就会犯错误。get(0)在其uri中有正确的路径