Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending data to android wear device

I'm trying to send a String array from my phone to my wear, I've created a service on my phone that is supposed to send the data with this code :

public class SendDataService extends Service {

private static final String TAG = "SendDataService";

@Override
public void onCreate(){
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.d(TAG, "onConnected: " + connectionHint);
                    // Now you can use the data layer API
                }
                @Override
                public void onConnectionSuspended(int cause) {
                    Log.d(TAG, "onConnectionSuspended: " + cause);
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult result) {
                    Log.d(TAG, "onConnectionFailed: " + result);
                }
            })
            .addApi(Wearable.API)
            .build();
    mGoogleApiClient.connect();
    String[] eventStrings = Events.eventsString(Events.readCalendarEvent(this));
    PutDataMapRequest dataMap = PutDataMapRequest.create("/events");
    dataMap.getDataMap().putStringArray("events", eventStrings);
    PutDataRequest request = dataMap.asPutDataRequest();
    PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
            .putDataItem(mGoogleApiClient, request);
    mGoogleApiClient.disconnect();
}

and from the watch I try to get it in my main activity with this code :

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_agenda_wear);
    this.context = this;
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.d(TAG, "onConnected: " + connectionHint);
                    // Now you can use the data layer API
                }
                @Override
                public void onConnectionSuspended(int cause) {
                    Log.d(TAG, "onConnectionSuspended: " + cause);
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult result) {
                    Log.d(TAG, "onConnectionFailed: " + result);
                }
            })
            .addApi(Wearable.API)
            .build();
    mGoogleApiClient.connect();


    PendingResult<DataItemBuffer> results = Wearable.DataApi.getDataItems(mGoogleApiClient);
    results.setResultCallback(new ResultCallback<DataItemBuffer>() {
        @Override
        public void onResult(DataItemBuffer dataItems) {
            if (dataItems.getCount() != 0) {
                DataMapItem dataMapItem = DataMapItem.fromDataItem(dataItems.get(0));

                // This should read the correct value.
                AgendaWear.this.eventString = dataMapItem.getDataMap().getStringArray("events");
            }

            dataItems.release();
        }
    });
    mGoogleApiClient.disconnect();
    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            if (AgendaWear.this.eventString == null){
                Toast.makeText(AgendaWear.this, "No data",Toast.LENGTH_LONG).show();
                AgendaWear.this.eventString = new String[0];
            }
            AgendaWear.listItems = eventArray(AgendaWear.this.eventString);
            mListView = (WearableListView) stub.findViewById(R.id.listView);
            mListView.setAdapter(new MyAdapter(AgendaWear.this));
            mListView.setClickListener(AgendaWear.this);
        }
    });
}

But unfortunately, I always get the "no data" toast and I'm a bit stuck here, I have the line<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> on both the wear and mobile part of my app, but I don't seem to get any data. Thank you in advance for your help

like image 559
Quentin Menini Avatar asked Aug 20 '14 19:08

Quentin Menini


People also ask

Does Wear OS work with Android?

Wear OS works with phones running Android 6.0+ (excluding Go edition) or iOS 13.0+. Supported features may vary between platforms and countries. Visit g.co/WearCheck on your Android phone or iPhone® to see if it's compatible. Wear OS for iOS is available for iPhone 5S+ and later.

What data do Smartwatches collect?

Smart watches collect a lot of information about you. It could be the number of steps you took in a day and where you went, or financial information if your device is enabled to make payments. And the list grows, depending on the apps you've installed and the personal information you've provided.

Can Wear OS connect to any smartwatch?

To use your smartwatch, first connect your watch to your phone with the Wear OS app. Watches that run Wear OS 3 are not compatible with the Wear OS app.


1 Answers

Maybe I can help.

This code works for me, sends an array of strings from the device to be received in the wearable:

Device code:

@Override
public void onCreate() {

    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Wearable.API)
            .build();

    googleApiClient.connect();
}    


@Override
public void onConnected(Bundle bundle) {

  String [] myData = new String[]{"data1", "data2", "data3"};
  new DataTask (getActivity(), myData, myListener).execute();
}


class DataTask  extends AsyncTask<Node, Void, Void> {

    private final String[] contents;
    private MyListener myListener;
    Context c;

    public DataTask (Context c, String [] contents, MyListener myListener) {
        this.c = c;
        this.contents = contents;
        this.myListener = myListener;
    }

    @Override
    protected Void doInBackground(Node... nodes) {

        PutDataMapRequest dataMap = PutDataMapRequest.create ("/myapp/myevent");
        dataMap.getDataMap().putStringArray("contents", contents);

        PutDataRequest request = dataMap.asPutDataRequest();

        DataApi.DataItemResult dataItemResult = Wearable.DataApi
                .putDataItem(googleApiClient, request).await();


        Log.d ("[DEBUG] SendDataCoolTask - doInBackground", "/myapp/myevent" status, "+getStatus());
        return null;
    }
}

Wearable code:

@Override
public void onConnected(Bundle bundle) {

    Wearable.DataApi.addListener(googleApiClient, this);
}

    @Override
public void onDataChanged(DataEventBuffer dataEvents) {

    for (DataEvent event: dataEvents) {

        Log.d("[DEBUG] DeviceService - onDataChanged",
                "Event received: " + event.getDataItem().getUri());

        String eventUri = event.getDataItem().getUri().toString();

        if (eventUri.contains ("/myapp/myevent")) {

            DataMapItem dataItem = DataMapItem.fromDataItem (event.getDataItem());
            String[] data = dataItem.getDataMap().getStringArray("contents");

            Log.d("[DEBUG] DeviceService - onDataChanged", "Sending timeline to the listener");

            myListener.onDataReceived(data);
        }
    }
}
like image 77
saulmm Avatar answered Oct 06 '22 20:10

saulmm