可穿戴的MessageAPI onMessageReceived永远不会命中,不同的设备ID

时间:2017-08-09 14:44:43

标签: wear-os android-wear-data-api

尝试从模拟的移动设备向模拟的佩戴设备发送消息。我可以通过Android Wear应用程序配对磨损设备,并验证磨损设备的onPeerConnected是否被击中(onMessageReceived不是)。

使用两个代码版本返回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

返回: 08-09 10: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();

返回: 08-09 10: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");
            }

我已经阅读了与此相似的每个SO问题,但没有看到任何人提到不同的设备ID。我已经三次检查了mobileIds和依赖关系在移动设备和磨损之间是否相同。

更新:

如果取消配对Wear模拟器并运行Wearable.NodeApi.getLocalNode我仍然会返回nodeId,而Wearable.NodeApi.getConnectedNodes则不会,这让我相信getConnectedNodes是我应该使用的。

此外,关闭Wear模拟器仍会返回getLocalNode的连接节点ID,这使我相信它会返回手表以外的其他内容。

2 个答案:

答案 0 :(得分:1)

首先,不要使用onPeerConnected等弃用的方法。 始终使用CapabilityApi方法。这是不可能的!

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

如果您使用的是旧版API,则必须了解现代API(如CapabilityApi)不起作用。

如今,无法在模拟的可穿戴设备和模拟的手持设备之间建立稳定的连接。其中一个必须是一个真正的设备。

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

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

在发布之前减少GoogleServices库版本,以使您的应用可用于未更新的设备。

在我的实践中,模拟器的工作非常奇怪。

答案 1 :(得分:0)

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

检查此相关的SO票证: