2014-07-06 11 views
14

Sto testando il livello dati indossabile Api come descritto nello Android tutorial.Che cos'è Uri per Wearable.DataApi.getDataItem() dopo aver usato PutDataMapRequest?

C'è un'API basso livello basata soprattutto DataItem, che può avere solo una matrice di byte come payload, così la formazione consiglia di utilizzare PutDataMapRequest, che sembra essere sostanzialmente equivalente ad un (cioè una cartina serializzabile) Bundle utilizzando Intents. In pratica, crei un'istanza di questa classe, quindi riempi i valori e invialo.

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(...); 

Ora, voglio verificare se questo dato è stato conservato correttamente (per il test, sul palmare stesso, io non sono preoccupato per il wearable in questo momento). I metodi adeguati per questo sono nella classe DataApi, quindi mi possono chiamare:

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

e quindi utilizzare DataMapItem.fromDataItem() all'interno del callback per ottenere il valore.

Il problema è: qual è l'Uri effettivo per richiedere DataItemResult?

I dati vengono memorizzati, perché se io uso Wearable.DataApi.getDataItems(mGoogleApiClient) di scorrere oltre tutti dati memorizzati, è davvero lì, e l'Uri è:

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

E l'utilizzo di questo Uri con DataApi.getDataItem() restituisce il risultato corretto . Ma io sono all'oscuro su come generare che, da quando ho usato solo la parte /testdata per creare il PutDataRequest ...

O sto facendo le cose in modo errato?

risposta

23

L'autorità del URI (che è descritto come < alcuni guid qui > nel tuo post) è ID nodo che è disponibile tramite Nodo API. In breve, puoi costruire l'Uri come segue.

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; 
} 
+0

Perfetto! Non l'avevo visto. E presumo che ogni dispositivo connesso abbia il proprio ID di nodo? – matiash

+0

Sì, lo è. l'id del nodo e l'url dell'elemento sono menzionati anche in questo video. https://www.google.com/events/io/schedule/session/9bf77f55-afbe-e311-b297-00155d5066d7 – Poly

+0

Sì, ho visto quel video dopo aver letto la tua risposta. Grazie ancora! – matiash

Problemi correlati