【问题标题】:Wearable MessageAPI onMessageReceived never hit, different devices id's可穿戴的 MessageAPI onMessageReceived 从未命中,不同的设备 ID
【发布时间】:2018-01-17 12:49:34
【问题描述】:

尝试从模拟移动设备向模拟穿戴设备发送消息。我可以通过 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。我反复检查了移动设备和 Wear 之间的 applicationId 和依赖项是否相同。

更新:

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

此外,关闭 Wear 模拟器仍会返回 getLocalNode 的连接节点 ID,这让我相信它返回的不是手表。

【问题讨论】:

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


    【解决方案1】:

    首先,不要使用过时的方法,如 onPeerConnected。 始终使用 CapabilityApi 方法。这是无关紧要的!

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

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

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

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

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

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

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

    【讨论】:

    • 我不知道 onPeerConnected 已被弃用。通常,如果某个 api 被弃用,Android Studio 会显示一条消息,但它不适用于onPeerConnected。不幸的是,我拥有的设备还没有我需要的 API,所以我不得不使用模拟器。我会调查CapabilityAPI。谢谢
    • 如果这对将来的任何人有帮助,您可以使用模拟器将消息从手机发送到使用记录不佳的磨损设备 CapabilityApi
    【解决方案2】:

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

    检查这个相关的 SO 票:

    【讨论】:

    • 感谢您的回复。我正在根据您的帖子调查 CapabilityApis。我遇到有人建议确保每个设备都使用相同的证书,尽管我认为模拟器不需要担心证书。经过多次反复试验,我认为getConnectedNodes 是正确的使用方法,它似乎可以正确发送消息,但穿戴应用程序没有收到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多