2017-08-09 5 views
7

Der Versuch, eine Nachricht von einem emulierten Mobilgerät an ein emuliertes Verschleißgerät zu senden. Ich bin in der Lage, das Verschleißgerät durch die Android Wear App zu paaren und zu verifizieren, dass onPeerConnected des Verschleißgeräts getroffen wird (onMessageReceived ist nicht).Wearable MessageAPI onMessageReceived traf nie, unterschiedliche Geräte-IDs

Die Verwendung von zwei Codeversionen zur Rückgabe node.getId() führt zu zwei verschiedenen IDs des Verschleißgeräts.

Ausführen dieses:

  new Thread(new Runnable() { 
       @Override 
       public void run() { 

        NodeApi.GetLocalNodeResult nodes = Wearable.NodeApi.getLocalNode(mGoogleApiClient).await(); 
        Node node = nodes.getNode(); 
        MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), "Hello Watch 1", null).await(); 

        if (!result.getStatus().isSuccess()) { 
         Log.e(getPackageName(), "error"); 
        } else { 
         Log.i(getPackageName(), "success!!!! sent to: " + node.getId()); 
        } 
       } 
      }).start 

kehrt: 08-09 Oktober: 24: 33,106 17.914-18.007/com.wear.myapp I/com.wear.myapp: Erfolg !!!! verschickt an: 223faf0e

Ausführen dieses:

  new Thread(new Runnable() { 
       @Override 
       public void run() { 

        NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await(); 

        for (Node node : nodes.getNodes()) { 
         MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), "Hello Watch 2", null).await(); 

         if (!result.getStatus().isSuccess()) { 
          Log.e(getPackageName(), "error"); 
         } else { 
          Log.i(getPackageName(), "success!!!! sent to: " + node.getId()); 
         } 
        } 
       } 
      }).start(); 

Returns: 08-09 Oktober: 24: 33.108 17.914 bis 18.006/com.wear.myapp I/com.wear.streamer: Erfolg !!!! verschickt an: 3a000c12

Noch seltsamen Hardcoding in einem gefälschten Node-ID für das Verschleiß Gerät gibt immer noch eine Erfolgsmeldung in den Protokollen. Fühle mich wie ein falsches positives Ergebnis.

WearableListenerService:

  @Override 
      public void onMessageReceived(MessageEvent messageEvent) { 
       Log.i(getPackageName(), "Message received"); 
      } 


      @Override 
      public void onPeerConnected(Node peer) { 
       Log.i(getPackageName(), "Peer connected"); 
      } 

Ich habe durch alle so ähnliche Fragen wie diese lesen, aber nicht jemand anderes Gerät ids erwähnen gesehen. Ich habe dreifach überprüft, dass die Anwendungs-IDs und Abhängigkeiten zwischen Mobile und Wear identisch sind.

UPDATE:

Wenn unpair der Wear-Emulator und laufen Wearable.NodeApi.getLocalNode Ich kehrte noch eine nodeId bekommen, während Wearable.NodeApi.getConnectedNodes nicht der Fall ist, was mich getConnectedNodes ist zu glauben, führt, was sollte ich verwenden.

Auch das Herunterfahren des Wear-Emulators gibt immer noch eine verbundene Knoten-ID für getLocalNode zurück, was mich zu der Annahme verleitet, dass es etwas anderes zurückgibt als die Uhr.

Antwort

1

Zunächst einmal verwenden keine veralteten Methoden wie onPeerConnected. Verwenden Sie stattdessen immer CapabilityApi-Methoden. Das ist Improtaint!

Ich habe eine Frage. Welche Art von Android Wear APK (auf Handheld) -Datei verwenden Sie? Weißt du nicht, dass moderne Versionen von Android Wear APK nicht nützlich sind? Sie funktionieren nicht richtig.

Wenn Sie die alte Version von API verwenden, müssen Sie verstehen, dass moderne APIs wie CapabilityApi nicht funktioniert.

Heutzutage ist es nicht möglich, eine stabile Verbindung zwischen emuliertem Wearable und emuliertem Handheld herzustellen. Einer von ihnen muss ein echtes Gerät sein.

Die einzige Lösung, die ich vorschlagen kann, ist Ihre Anwendung von realen tragbaren und Handheld-Geräten zu testen.

Verwenden Sie immer die aktuelle GoogleServices-Bibliothek, um reale Geräte zu testen und nicht veraltete APIs zu verwenden.

Bevor Sie veröffentlichen, verringern Sie die Version der GoogleServices-Bibliothek, um Ihre App für nicht aktualisierte Geräte funktionsfähig zu machen.

In meiner Praxis arbeiten Emulatoren sehr seltsam.

+0

Ich war mir nicht bewusst, dass 'onPeerConnected' veraltet war. Normalerweise zeigt Android Studio eine Nachricht an, wenn eine API veraltet ist, aber nicht für "onPeerConnected". Leider haben die Geräte, die ich besitze, nicht die APIs, die ich noch brauche, also bin ich gezwungen, den Emulator zu benutzen. Ich werde in das CapabilityAPI schauen. Danke –

+0

Wenn dies in der Zukunft hilft, können Sie die Emulatoren verwenden, um Nachrichten von einem Telefon an ein Verschleißgerät mit dem schlecht dokumentierten 'CapabilityApi' zu senden –

0

Ein mögliches Problem könnte das Folgende sein: Sie greifen alle verbundenen Knoten und dann greifen Sie den allerersten, um für Ihre Nachricht zu zielen. Das kann sehr wohl der Cloud-Knoten sein (oder ein anderes tragbares Gerät, wenn Sie mehrere haben) und nicht Ihr Telefon. Der richtige Ansatz besteht darin, mithilfe von CapabilityApis den richtigen Knoten zu finden, an den Ihre Nachricht gesendet werden soll. Sehen Sie sich in Ihrem Code den Knoten node.toString() für den von Ihnen ausgewählten Knoten an, um zu bestätigen, dass er die Cloud auswählt, um sicher zu gehen, dass dies der Fall ist.

prüfen Zusammenhang damit SO Ticket:

+0

Danke für die Antwort. Ich schaue mir die CapabilityApis per Post an. Ich stieß auf jemanden, der vorschlug, dafür zu sorgen, dass für jedes Gerät das gleiche Zertifikat verwendet wird, obwohl ich nicht dachte, dass Emulatoren sich um Zertifikate kümmern müssten. Nach mehr Versuch und Irrtum denke ich, dass 'getConnectedNodes' ist die richtige Methode zu verwenden und es scheint, die Nachricht korrekt zu senden, aber die Verschleiß-App nicht erhalten. –

Verwandte Themen