2017-08-09 5 views
7

Próbujesz wysłać wiadomość z emulowanego urządzenia przenośnego do emulowanego urządzenia zużycia. Potrafię powiązać urządzenie zużywające się z aplikacją Android Wear i sprawdzić, czy zostało uszkodzone urządzenie onPeerConnected (nie jest to onMessageReceived).Wearable MessageAPI onMessageReceived nigdy nie hit, różne urządzenia id

Używanie dwóch wersji kodu do zwracania node.getId() powoduje wyświetlenie dwóch różnych identyfikatorów urządzenia zużycia.

Running to:

  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 

Powroty: 08-09 10: 24: 33.106 17914-18007/com.wear.myapp I/com.wear.myapp: sukces !!!! przesyłać na adres: 223faf0e

Running to:

  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(); 

Powroty: 08-09 10: 24: 33.108 17914-18006/com.wear.myapp I/com.wear.streamer: sukces !!!! przesyłać na adres: 3a000c12

Nawet obcy hardcoding w fałszywym ID węzła dla urządzenia ścieranie nadal zwraca komunikat sukces w dziennikach. Poczuj się tak, jakbym uzyskał fałszywy pozytywny wynik.

WearableListenerService:

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


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

Czytałem przez co tak podobne do tego pytania, ale nie widać nikogo innego urządzenia wspomnieć identyfikatorów. Sprawdziłem potrójnie, czy identyfikatory aplikacji i zależności są identyczne między komórką a zużyciem.

UPDATE:

Jeśli rozłączyć emulatora zużycia i uruchomić Wearable.NodeApi.getLocalNode I jeszcze dostać nodeid powrócił, a Wearable.NodeApi.getConnectedNodes nie, co prowadzi mi uwierzyć getConnectedNodes jest to, co powinno być używane.

Co więcej, zamknięcie emulatora Zużycie nadal zwraca połączony identyfikator węzła dla getLocalNode, co prowadzi mnie do przekonania, że ​​zwraca coś innego niż zegarek.

Odpowiedz

1

Przede wszystkim, nie należy używać przestarzałe metody jak onPeerConnected. Zawsze należy stosować metody CapabilityApi. To jest improtaint!

Mam pytanie. Z jakiego rodzaju pliku Android Wear APK (na urządzeniu przenośnym) korzystasz? Czy nie wiesz, że współczesne wersje pakietu Android Wear APK nie są przydatne? Nie działają poprawnie.

Jeśli używasz starej wersji interfejsu API, musisz zrozumieć, że nowoczesne interfejsy API, takie jak CapabilityApi, nie działają.

Obecnie nie jest możliwe stworzenie stabilnego połączenia między emulowanym podręcznym urządzeniem przenośnym i emulowanym. Jeden z nich musi być prawdziwym urządzeniem.

Jedyne rozwiązanie, które mogę zasugerować, to przetestować aplikację prawdziwych urządzeń przenośnych i przenośnych.

Zawsze używaj najnowszej biblioteki GoogleServices do testowania, używania prawdziwych urządzeń, nieużywania API.

Przed publikacją zmniejsz wersję biblioteki Google Services, aby aplikacja działała prawidłowo w przypadku niezaktualizowanych urządzeń.

W mojej praktyce emulatory działają bardzo dziwnie.

+0

Nie wiedziałem, że "onPeerConnected" jest przestarzałe. Zazwyczaj program Android Studio wyświetla komunikat, jeśli api jest przestarzałe, ale nie jest dla "onPeerConnected". Niestety posiadane przeze mnie urządzenia nie mają jeszcze potrzebnych interfejsów API, więc jestem zmuszony do korzystania z emulatora. Zajrzę do 'CapabilityAPI'. Dzięki –

+0

Jeśli to pomoże każdemu w przyszłości, możesz użyć emulatorów do wysyłania wiadomości z telefonu do urządzenia zużywającego się przy użyciu słabo udokumentowanego 'CapabilityApi' –

0

Jednym z możliwych problemów może być: pobieranie wszystkich podłączonych węzłów, a następnie pobranie pierwszego z nich, który ma trafić do wiadomości. To może bardzo dobrze być węzłem w chmurze (lub innym urządzeniem do noszenia, jeśli masz wiele), a nie telefonem. Prawidłowe podejście polega na użyciu CapabilityApis do znalezienia odpowiedniego węzła do wysłania wiadomości. W swoim kodzie, spójrz na node.toString() dla węzła, który wybrałeś, aby potwierdzić, że wybiera chmurę, aby mieć pewność, że to jest problem.

Sprawdź to związane SO bilet:

+0

Dzięki za odpowiedź. Sprawdzam CapabilityApis na twój post. Natknąłem się na kogoś sugerującego, aby upewnić się, że ten sam certyfikat jest używany dla każdego urządzenia, chociaż nie sądziłem, że emulatory muszą martwić się o certyfikaty. Po kolejnych próbach i błędach myślę, że 'getConnectedNodes' jest poprawną metodą i wydaje się, że wysyła wiadomość poprawnie, ale aplikacja do noszenia nie otrzymuje go. –

Powiązane problemy