2014-07-25 13 views
15

Ich arbeite an Android Wear App mit Eclipse IDE.Ich benutze gleiche Paketnamen für tragen App und mobile App und ich bin tragbare App manuell nach google documentation Verpacken. Alles funktioniert gut.Es ist installiert auf Android Wear Emulator mit USB-Debugging mit Telefon.OnMessageReceived nicht in WearableListenerService aufgerufen

Mein Problem ist, wenn ich eine Nachricht sende folgenden Code verwenden, um tragbare

List<Node> nodeList=getNodes(); 
for(Node node : nodeList) { 
    Log.v(" ", "telling " + node.getId()); 

    PendingResult<MessageApi.SendMessageResult> result = Wearable.MessageApi.sendMessage(
     mGoogleApiClient, 
     node.getId(), 
     START_ACTIVITY_PATH, 
     null 
    ); 

    result.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() { 
     @Override 
     public void onResult(MessageApi.SendMessageResult sendMessageResult) { 
      Log.v(" ", "Phone: " + sendMessageResult.getStatus().getStatusMessage()); 
     } 
    }); 
} 

die OnPeerConnected Methode ausgeführt wird, wenn Geräte spähte sind aber OnMessageReceived nie in WearableListenerService.This genannt ist mein WearableListenerService Code:

public class DataLayerListenerService extends WearableListenerService { 

    private static final String TAG = "DataLayerSample"; 
    private static final String START_ACTIVITY_PATH = "/start/MainActivity"; 
    private static final String DATA_ITEM_RECEIVED_PATH = "/data-item-received"; 
    private static final String LOG_TAG = "log"; 
    @Override 
    public void onPeerConnected(Node peer) { 
     super.onPeerConnected(peer); 

     String id = peer.getId(); 
     String name = peer.getDisplayName(); 

     Log.d(LOG_TAG, "Connected peer name & ID: " + name + "|" + id); 
    } 
    @Override 
    public void onDataChanged(DataEventBuffer dataEvents) { 
     System.out.println("Recevive message3"); 
    } 

    @Override 
    public void onMessageReceived(MessageEvent messageEvent) { 
     System.out.println("service watch message1"); 
     if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) { 
      System.out.println("service watch message2"); 
      Intent startIntent = new Intent(this, MainActivity.class); 
      startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(startIntent); 
     } 
    } 
} 

auch eine Warnmeldung in Logcat erscheint immer:

App nicht Rekord App Schlüssel passen: AppKey [com.myapp, c3f31717fa35401056c20a2798907f1232efa75e] = AppKey [com.myapp, f36e726eefc7e528db26a1c25f6fbf2f93dacd70]

Wenn App Schlüssel für beide Anwendungen gleich sein sollte dann wie kann ich gleiche App Schlüssel erstellen für beide Apps.

Jede Hilfe wird sehr geschätzt, Danke.

+0

Was sind 'com.myphoneapp' und' com.wearableapp'? –

+0

@Maciej. Es war versehentlich.Jetzt habe ich meinen Beitrag korrigiert. Eine "com.myapp" -Anweisung ist für Paketname des Telefons App und Sekunde ist für Wear app.Anyway danke für die Antwort. –

+0

Kein Problem. Bitte schauen Sie sich meine Antwort unten :) –

Antwort

10

Die Fehlermeldung Sie haben:

App nicht app Rekord Schlüssel überein: AppKey [com.myapp, c3f31717fa35401056c20a2798907f1232efa75e] = AppKey [com.myapp, f36e726eefc7e528db26a1c25f6fbf2f93dacd70]

Angezeigt, dass Ihre Apps mit den verschiedenen Schlüsseln signiert sind.
Paketnamen von Telefon und Wearable Apps sind gleich - das ist gut, aber sie müssen auch die gleiche Signatur teilen. Dies ist der Grund, warum Nachrichten nicht zugestellt werden können - tragbare Apps werden basierend auf dem Paketnamen und der Signatur als "Teil derselben App" erkannt.

Bitte stellen Sie sicher, dass Sie beide Apps mit demselben Schlüssel signiert haben. Wenn Sie die Autoinstallationsfunktion testen, stellen Sie sicher, dass Sie die Debug-Version der Wearable App vom Watch Emulator deinstallieren.

+0

Dank @Maciej. Jetzt kann ich das Problem sehen. Wearable App ist unterzeichnet, aber Android App ist direkt am Telefon installiert (über das Debuggen von USB) .Wenn ich richtig dann bin, was soll ich tun, um es unterzeichnet zu machen? Oder, wenn Sie das Problem mit der Deinstallation der Debug-Version lösen können, wie kann ich das tun.Bitte führen .. –

+0

Sie sagen, Ihre Wearable App ist signiert - wie haben Sie es unterzeichnet? Sie müssen auch die Telefon-App unterschreiben, damit sie miteinander kommunizieren können. "Nur deinstallieren" wird das Problem nicht beheben :) - Sie müssen es durch die signierte Version ersetzen (das bedeutet: un-signierte Version deinstallieren + neue signierte Version installieren). Bitte beachten Sie, dass Sie für Tests und Entwicklung beide unsignierte Apps verwenden können. Nur bei einigen abschließenden Tests (vor der Veröffentlichung im Store) können Sie das Endergebnis für signierte Apps testen. Erzählen Sie mir bitte weitere Details zu Ihrer Einrichtung, warum haben Sie eine App unterschrieben und andere nicht? –

+0

Ich verpacke tragbare App in mobile App mit signierten Keystore-Zertifikaten.Jetzt teste ich es auf meinem Handy mit USB-Debugging.Wenn ich mit usb testen, gibt es keine Option zum Signieren meiner Handy-App, dh ich erstelle nicht seine apk-Datei und installieren es direkt am Telefon. So denke ich, dass mein Telefon App unsigned.it wird eine verwirrende Situation für mich atleast. –

2

Verwenden Sie eine asyntask, um Nachrichten zu senden, da sie den ui-Thread blockieren. Außerdem müssen Sie die Methode "Warten" aufrufen. Damit die Apps den gleichen Schlüssel haben, müssen Sie Build-Varianten mit Gradle verwenden.

public class SendMessageTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... voids) { 
     NodeApi.GetConnectedNodesResult nodes = 
       Wearable.NodeApi.getConnectedNodes(apiClient).await(); 
     for (Node node : nodes.getNodes()) { 
      Wearable.MessageApi 
        .sendMessage(apiClient, node.getId(), "/start/MainActivity", null) 
        .await(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     Toast.makeText(MainActivity.this, "Message Sent", Toast.LENGTH_SHORT).show(); 
    } 
} 
+1

Eine Verwendung einer AsyncTask ist nicht notwendig, da die MessageApi bereits Async-Unterstützung hat. Ersetzen Sie einfach die.awarn() - Aufruf mit einem Aufruf von setResultCallback(), der den Rückruf nach Beendigung des Aufrufs weiterleitet. Mit AsyncTask wird nur ein zusätzlicher Thread erstellt, der nicht benötigt wird. – Martin

9

Ich hatte den gleichen Fehler, mein Fehler war, dass der "Verschleiß" -Modul Paketname nicht das gleiche wie die App war.

BAD: 
[module: app] es.voghdev.myapp 
[module: wear] es.voghdev.myapp.wear 

GOOD: 
[module: app] es.voghdev.myapp 
[module: wear] es.voghdev.myapp 

Ich habe so viel Zeit verschwendet !! > :-(

+1

Mann, du hast mich gerettet! Ich werde zweimal upvote :) – DraganescuValentin

+0

Lebensretter! Danke, Mann! – WenChao

Verwandte Themen