Ich habe eine App auf dem tragbaren, die eine Datamap an den Handheld per Knopfdruck senden sollte. Ich habe fast das gleiche Setup vom Handheld zum Telefon gemacht, nur der Unterschied ist, dass ich eine Nachricht gesendet habe, die perfekt funktioniert, und jetzt möchte ich eine DataMap
den anderen Weg senden.WearableListenerService onDataChanged nicht am Telefon angerufen
Ich bin mir ziemlich sicher, dass ich das richtige Setup habe, aber immer noch die onDataChanged()
auf dem wearableListenerService
auf dem Telefon wird nie aufgerufen. Habe ich etwas Wichtiges vergessen oder was ist sonst noch falsch?
Bitte werfen Sie einen Blick und sparen Sie meinen Tag! :)
Hier ist der Thread, der die Datamap aus dem Wearable sendet (aus dem wearable mainActivity aufgerufen, der GoogleClient existiert und ich habe den Thread gestartet). Debugging gibt zurück, dass die Datamap erfolgreich gesendet wurde.
public class SendDataMapToHandheldDataLayer_Thread extends Thread {
private String path;
private DataMap dataMap;
private GoogleApiClient googleClient;
public SendDataMapToHandheldDataLayer_Thread(String cPath, DataMap cDataMap, GoogleApiClient cGoogleClient){
path = cPath;
dataMap = cDataMap;
googleClient = cGoogleClient;
}
public void run(){
PutDataMapRequest putDMR = PutDataMapRequest.create(path);
putDMR.getDataMap().putAll(dataMap);
PutDataRequest request = putDMR.asPutDataRequest();
DataApi.DataItemResult result = Wearable.DataApi.putDataItem(googleClient, request).await();
if(result.getStatus().isSuccess()){
Log.v("dataMapSender_Wear", "DataMap successfully sent!");
}else{
Log.v("dataMapSender_Wear", "ERROR: Failed to send DataMap to data layer");
}
}
}
Und hier ist der Hörer auf dem Telefon, die nie aufgerufen wird. Warum? Es ist im Wesentlichen nur kopiert von der Android-Entwickler-Tutorial hier gefunden: http://developer.android.com/training/wearables/data-layer/events.html#Listen. Ich habe auch eigene Versionen ausprobiert, aber ich denke, das Problem liegt woanders.
public class ListenerServiceMobile extends WearableListenerService{
private static final String TAG = "DataLayerSample";
private static final String START_ACTIVITY_PATH = "/start-activity";
private static final String DATA_ITEM_RECEIVED_PATH = "/data-item-received";
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
Toast.makeText(getApplicationContext(), "Data changed!", Toast.LENGTH_LONG).show();
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "onDataChanged: " + dataEvents);
}
final List<DataEvent> events = FreezableUtils
.freezeIterable(dataEvents);
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.build();
ConnectionResult connectionResult =
googleApiClient.blockingConnect(30, TimeUnit.SECONDS);
if (!connectionResult.isSuccess()) {
Log.e(TAG, "Failed to connect to GoogleApiClient.");
return;
}
// Loop through the events and send a message
// to the node that created the data item.
for (DataEvent event : events) {
Uri uri = event.getDataItem().getUri();
// Get the node id from the host value of the URI
String nodeId = uri.getHost();
// Set the data of the message to be the bytes of the URI
byte[] payload = uri.toString().getBytes();
// Send the RPC
Wearable.MessageApi.sendMessage(googleApiClient, nodeId,
DATA_ITEM_RECEIVED_PATH, payload);
}
}
Die Manifest-Datei des mobilen enthält diese:
<service android:name=".ListenerServiceMobile">
<intent-filter>
<action android:name="com.google.android.gms.wearable.DATA_CHANGED"></action>
<data android:scheme="wear" android:host="*" android:pathPrefix="/prefix" />
</intent-filter>
</service>
Danke für die Beantwortung! :)