Подтвердить что ты не робот

Что такое Uri для Wearable.DataApi.getDataItem() после использования PutDataMapRequest?

Я тестирую Wearable Data Layer Api, как описано в учебнике Android.

Существует низкоуровневый API, основанный на DataItem, который может содержать только байтовый массив как полезную нагрузку, поэтому обучение рекомендует использовать PutDataMapRequest, который, по-видимому, в основном эквивалентен Bundle (т.е. сериализуемой карте) при использовании 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(...);

Теперь я хочу проверить, правильно ли были сохранены эти данные (для тестирования на самом КПК я не беспокоюсь о пригодности для носки прямо сейчас). Соответствующие методы для этого относятся к классу DataApi, поэтому я могу вызвать:

PendingResult<DataApi.DataItemResult> pending;
pending = Wearable.DataApi.getDataItem(mGoogleApiClient, uri);
pending.setResultCallback(...);

а затем используйте DataMapItem.fromDataItem() внутри обратного вызова, чтобы получить значение.

Проблема заключается в следующем: каков фактический Uri для запроса DataItemResult?

Данные сохраняются, потому что, если я использую Wearable.DataApi.getDataItems(mGoogleApiClient) для перебора всех сохраненных данных, это действительно так, и Uri:

"wear://<some guid here>/testdata"

И использование этого Uri с DataApi.getDataItem() возвращает правильный результат. Но я не знаю, как сгенерировать, так как я использовал только часть /testdata для создания PutDataRequest...

Или я делаю что-то неправильно?

4b9b3361

Ответ 1

Власть uri (которая в заголовке описывается как < some guid здесь > ) в столбце Node Id, который доступен через Node 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;
}