2016-04-05 18 views
0

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! :)

Antwort

-1

Ich würde mit dem Entfernen der android:pathPrefix beginnen, da es die Daten filtert, auf die Ihr Dienst wartet. Sie sollten jetzt die onDataChange() aufgerufen werden.

Nachdem die Daten angezeigt werden, können Sie zurückgehen und pathPrefix auf den Pfad festlegen, den Sie in Ihrem Wearable festlegen. (Ich rate/Daten-Artikel-erhalten). Der pathPrefix entspricht dem Anfang dessen, was Sie nach dem Host angeben. Hier

ist das, was Sie wollen, wenn das der Fall ist:

<service android:name=".ListenerServiceMobile"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.wearable.DATA_CHANGED" /> 
     <data android:scheme="wear" android:host="*" 
       android:pathPrefix="/data-item-received"" /> 
    </intent-filter> 
</service> 
Verwandte Themen