Wearable MessageAPI onMessageReceived 从未命中,不同的设备 ID

Wearable MessageAPI onMessageReceived never hit, different devices id's

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

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

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

Returns: 08-09 10:24:33.108 17914-18006/com.wear.myapp I/com.wear.streamer: 成功!! !!发送至:3a000c12

甚至在可穿戴设备的假节点 ID 中进行硬编码的陌生人仍然 return 在日志中显示成功消息。感觉我得到了假阳性结果。

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。我已经三重检查了 applicationIds 和依赖项在 mobile 和 wear 之间是否相同。

更新:

如果取消配对 Wear 模拟器和 运行 Wearable.NodeApi.getLocalNode 我仍然得到一个 nodeId returned,而 Wearable.NodeApi.getConnectedNodes 没有,这让我相信 getConnectedNodes 是我应该使用的。

此外,关闭 Wear 模拟器仍然 return 是 getLocalNode 的连接节点 ID,这让我相信它 return 是手表以外的东西。

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

检查这张相关的 SO 票:

  • OnMessageReceived not called in WearableListenerService

  • onMessageReceived() never called, although connected to handheld

首先,不要使用像onPeerConnected这样的过时方法。 始终改用 CapabilityApi 方法。这是不安全的!

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

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

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

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

始终使用最新的 GoogleServices 库进行测试,使用真实设备,使用未弃用的 APIs。

在发布之前降低 GoogleServices 库版本以使您的应用适用于未更新的设备。

在我的实践中,模拟器工作起来很奇怪。