Android 使用PutDataMapRequest后,Wearable.DataApi.getDataItem()的Uri是什么?

Android 使用PutDataMapRequest后,Wearable.DataApi.getDataItem()的Uri是什么?,android,wear-os,android-wear-data-api,Android,Wear Os,Android Wear Data Api,我正在测试可穿戴数据层Api,如中所述 有一个基于around的低级API,它只能有一个字节数组作为有效负载,因此培训建议使用,在使用Intents时,它似乎基本上相当于一个包(即可序列化的映射)。您基本上是创建这个类的一个实例,然后填充值并发送它 private final static String DATA_PATH = "/testdata"; PutDataMapRequest dataMap = PutDataMapRequest.create(DATA_PATH); dataMa

我正在测试可穿戴数据层Api,如中所述

有一个基于around的低级API,它只能有一个字节数组作为有效负载,因此培训建议使用,在使用Intents时,它似乎基本上相当于一个
包(即可序列化的映射)。您基本上是创建这个类的一个实例,然后填充值并发送它

private final static String DATA_PATH = "/testdata";

PutDataMapRequest dataMap = PutDataMapRequest.create(DATA_PATH);
dataMap.getDataMap().putInt(...);

PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(mGoogleApiClient, request);
pendingResult.setResultCallback(...);
然后在回调中使用
DataMapItem.fromDataItem()
来获取值

问题是:请求DataItemResult的实际Uri是什么?

数据是存储的,因为如果我使用迭代所有存储的数据,它确实在那里,Uri是:

"wear://<some guid here>/testdata"
”wear:///testdata"
并将此Uri与
DataApi.getDataItem()
一起使用,返回正确的结果。但是我不知道如何生成它,因为我只使用
/testdata
部分来创建
PutDataRequest

还是我做的不对?

uri的权限(在您的帖子中描述)是节点Id,可通过节点API获得。总之,您可以如下构造Uri

private Uri getUriForDataItem() {
    // If you've put data on the local node
    String nodeId = getLocalNodeId();
    // Or if you've put data on the remote node
    // String nodeId = getRemoteNodeId();
    // Or If you already know the node id
    // String nodeId = "some_node_id";
    return new Uri.Builder().scheme(PutDataRequest.WEAR_URI_SCHEME).authority(nodeId).path("/path_to_data").build();
}

private String getLocalNodeId() {
    NodeApi.GetLocalNodeResult nodeResult = Wearable.NodeApi.getLocalNode(mGoogleApiClient).await();
    return nodeResult.getNode().getId();
}

private String getRemoteNodeId() {
    HashSet<String> results = new HashSet<String>();
    NodeApi.GetConnectedNodesResult nodesResult =
            Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
    List<Node> nodes = nodesResult.getNodes();
    if (nodes.size() > 0) {
        return nodes.get(0).getId();
    }
    return null;
}
private Uri getUriForDataItem(){
//如果已将数据放在本地节点上
字符串nodeId=getLocalNodeId();
//或者如果您已将数据放在远程节点上
//字符串nodeId=getRemoteNodeId();
//或者如果您已经知道节点id
//String nodeId=“some\u node\u id”;
返回新的Uri.Builder().scheme(PutDataRequest.WEAR_Uri_scheme).authority(nodeId.path(“/path_to_data”).build();
}
私有字符串getLocalNodeId(){
NodeApi.GetLocalNodeResult nodeResult=Wearable.NodeApi.getLocalNode(mGoogleApiClient.await();
返回nodeResult.getNode().getId();
}
私有字符串getRemoteNodeId(){
HashSet results=新的HashSet();
NodeApi.GetConnectedNodeResult NodeResult=
Wearable.NodeApi.getConnectedNodes(mgoogleapClient.wait();
List nodes=nodesResult.getNodes();
如果(nodes.size()>0){
返回nodes.get(0.getId();
}
返回null;
}

完美!我没见过这个。我假设每个连接的设备都有自己的节点id?是的。节点id和项目url在本视频中也有提及。是的,我看了你的答案后看到了那个视频。再次感谢!实际上,节点可以省略。如果仅使用方案和路径,则将检索包含给定路径上所有
DataItem
元素的
DataItemBuffer
。然后你可以遍历它们。这在远程设备上对我不起作用。。。在设备上创建项目,但在另一个设备上不工作。但我在远程设备上接收到onDataChanged事件。我的URI似乎是正确的(用于获取数据项的URI与从onDataChanged中的事件中获取的URI相同)。有什么建议吗?附加信息:由于我无法让Android Studio为一个移动项目工作,我正在使用eclipse开发智能手机部分,但对于磨损部分,我使用Android Studio。
private Uri getUriForDataItem() {
    // If you've put data on the local node
    String nodeId = getLocalNodeId();
    // Or if you've put data on the remote node
    // String nodeId = getRemoteNodeId();
    // Or If you already know the node id
    // String nodeId = "some_node_id";
    return new Uri.Builder().scheme(PutDataRequest.WEAR_URI_SCHEME).authority(nodeId).path("/path_to_data").build();
}

private String getLocalNodeId() {
    NodeApi.GetLocalNodeResult nodeResult = Wearable.NodeApi.getLocalNode(mGoogleApiClient).await();
    return nodeResult.getNode().getId();
}

private String getRemoteNodeId() {
    HashSet<String> results = new HashSet<String>();
    NodeApi.GetConnectedNodesResult nodesResult =
            Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
    List<Node> nodes = nodesResult.getNodes();
    if (nodes.size() > 0) {
        return nodes.get(0).getId();
    }
    return null;
}