c__c
c__c

Reputation: 1612

Get data already sent from handheld to wear

I have sent data from mobile to wear as

    private static final String IMAGE_PATH = "/image";
    private static final String IMAGE_TITLE = "imageTitle";
    private static final String IMAGE_TO_SEND = "image";


    PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(IMAGE_PATH);
    putDataMapRequest.getDataMap().putString(IMAGE_TITLE, "hi this handheld");
    PutDataRequest putDataRequest = putDataMapRequest.asPutDataRequest();
    putDataRequest.setUrgent();
    Wearable.DataApi.putDataItem(googleApiClient, putDataRequest).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
        @Override
        public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
            if (dataItemResult.getStatus().isSuccess()) {

            } else {

            }
        }
    });

On wear side I want to first check if data has been already sent or not. If data has been sent already then I want to use that data otherwise I want to request data for mobile:

I have done it but it always fails. My code is as follow:

 Wearable.NodeApi.getLocalNode(googleApiClient).setResultCallback(new ResultCallback<NodeApi.GetLocalNodeResult>() {
            @Override
            public void onResult(@NonNull NodeApi.GetLocalNodeResult getLocalNodeResult) {
                Uri uri = new Uri.Builder()
                        .scheme(PutDataRequest.WEAR_URI_SCHEME)
                        .path(IMAGE_PATH)
                        .authority(getLocalNodeResult.getNode().getId())
                        .build();

                Wearable.DataApi.getDataItem(googleApiClient, uri).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                    @Override
                    public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
                        if (dataItemResult.getStatus().isSuccess() && dataItemResult.getDataItem() != null) {
                            Log.d(TAG, "onResult: success result");
                            DataMap dataMap = DataMap.fromByteArray(dataItemResult.getDataItem().getData());

                        } else {

                        }
                    }
                });
            }
        });

Upvotes: 2

Views: 393

Answers (2)

c__c
c__c

Reputation: 1612

I found solution. I was checking data by getting local nodes id ,so that it was providing null data.Local Node id i-e id of my watch, Node Id must be id of node which has sent data using Data Layer Api. In my case at first my handheld sends data through the Data Layer Api and my watch checks data exist or not.If data found gets data otherwise send request to Handheld.

Wearable.NodeApi.getConnectedNodes(googleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
                @Override
                public void onResult(NodeApi.GetConnectedNodesResult nodes) {
                    for (Node node : nodes.getNodes()) {
                        connectedNode = node;
                    }

                    Uri uri = new Uri.Builder()
                            .scheme(PutDataRequest.WEAR_URI_SCHEME)
                            .path(IMAGE_PATH)
                            .authority(connectedNode.getId()) //id which has sent data
                            .build();

                    Wearable.DataApi.getDataItem(googleApiClient, uri).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                        @Override
                        public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
                            if (dataItemResult.getStatus().isSuccess() && dataItemResult.getDataItem() != null) {
                                Log.d(TAG, "onResult: successfully got previous data");
                            } else {
                                makeRequestToSendData();
                                Log.d(TAG, "onResult: failed to got previous data");//request handheld to get data using **Message API**
                            }
                        }
                    });

                }
            });

We have to change getLocalNode to getConnectedNodes .

Upvotes: 2

Kapouter
Kapouter

Reputation: 147

Your code looks fine, is the node id non null ?

Does it fail at the getDataItem result callback ?

To get the DataMap from the DataItemResult, use this code :

DataItem dataItem = dataItemResult.getDataItem();
if (dataItem != null) {
       DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();

}

Upvotes: 0

Related Questions