2017-08-09 50 views
7

尝试从仿真移动设备发送消息到仿真耗材设备。我可以通过Android Wear应用程序将磨损设备配对,并确认磨损设备的onPeerConnected已被击中(onMessageReceived不是)。可穿戴MessageAPI onMessageReceived从未命中,不同设备ID的

使用两个代码版本返回node.getId()会导致两个不同的磨损设备ID。

运行此:

  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 

回报:10月8日至9日:24:33.106 17914-18007/com.wear.myapp I/com.wear.myapp:成功!!!!发送到:223faf0e

运行此:

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

返回:十月八日至九日:24:33.108 17914-18006/com.wear.myapp I/com.wear.streamer:成功!!!!发送到:3a000c12

即使陌生人在磨损设备假的节点ID硬编码仍然返回日志中的成功消息。感觉我得到了一个假阳性结果。

WearableListenerService:

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


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

我已经通过类似这样每做题阅读,但还没有看到任何人提不同的设备ID。我已经三重检查了移动和磨损之间的应用ID和相关性是相同的。

UPDATE:

如果取消配对磨损模拟器和运行Wearable.NodeApi.getLocalNode我仍然获得了NODEID返回,而Wearable.NodeApi.getConnectedNodes没有,这让我相信getConnectedNodes是我应该使用。

另外,关闭Wear模拟器仍然返回一个连接的节点ID为getLocalNode,这导致我相信它正在返回除手表之外的东西。

回答

1

首先,不要使用过时的方法,如onPeerConnected。 请改用CapabilityApi方法。这是伤痕累累的!

我有一个问题。您使用的是哪种Android Wear APK(手持设备)文件?难道你不知道Android Wear APK的现代版本没有用吗?他们无法正常工作。

如果您使用的是旧版本的API,则必须了解现代API(如CapabilityApi)无法正常工作。

现在,这是不可能在仿真的可穿戴设备和仿真手持设备之间建立稳定的连接。其中之一必须是真正的设备。

我建议的唯一解决方案是测试真正的可穿戴设备和手持设备的应用。

始终使用最新的GoogleServices库来测试,使用真实设备,不要使用已弃用的API。

在发布减少GoogleServices库版本之前,为了使您的应用程序适用于未更新的设备,

在我的练习中,模拟器的工作非常奇怪。

+0

我不知道'onPeerConnected'已被弃用。通常情况下,Android Studio会显示一条消息,如果api已被弃用,但它不适用于'onPeerConnected'。不幸的是,我拥有的设备没有我需要的API,所以我不得不使用模拟器。我会研究'CapabilityAPI'。谢谢 –

+0

如果这将有助于任何人,您可以使用模拟器从手机发送消息到磨损设备,使用记录不佳的“CapabilityApi” –

0

一个可能的问题可能是以下情况:您抓住所有连接的节点,然后抓住第一个针对您的消息的目标。这可以最终成为云节点(或者其他可穿戴设备,如果你有多个),而不是你的手机。正确的方法是使用CapabilityApis来找到正确的节点来发送消息。在您的代码中,查看您选择的节点的node.toString()以确认它正在选择云,以确定问题所在。

入住此相关的SO票:所有的

+0

感谢您的回复。我正在研究您的帖子中的CapabilityApis。我遇到了一个人建议确保每台设备都使用相同的证书,但我并不认为模拟器需要担心证书。 经过更多的试验和错误,我想'getConnectedNodes'是正确的使用方法,它似乎正确地发送消息,但磨损应用程序没有收到它。 –

相关问题