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。null アイテムが表示されるのはなぜですか?

4

1 に答える 1

2

watch デバイスで localNode を取得し、それを使用して dataUri を作成するのはなぜですか? DataItem が作成されると、その Uri には作成者の nodeId が含まれるため、モバイル デバイスでデータ アイテムを追加すると、その uri にはモバイル デバイスの nodeId が含まれるため、別のノードでそれらのアイテムを検索する場合は、作成者 (この場合はモバイル デバイス) の nodeId を使用する必要があり、受信者のローカル nodeId を使用して uri を作成しないでください。JavaDoc を参照してください。多くの場合、作成者の ID がわからないため、パスのみから構築された部分的な uri でgetDataItems () を使用します。さらに、onDataChanged() コールバックを使用し、パスに基づいてメッセージをフィルタリングすることをお勧めします。

于 2015-11-02T17:13:24.880 に答える