Reputation: 160
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
Upvotes: 5
Views: 12658
Reputation: 2438
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);
}
}
}
Upvotes: 7