Что такое 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
...
Или я делаю вещи неправильно?
1 ответ
Полномочия uri (который описан в вашем посте как "некоторое руководство") - это 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;
}