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

Kri*_*s B 7 android-wear-data-api wear-os

尝试从模拟的移动设备向模拟的佩戴设备发送消息.我可以通过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
Run Code Online (Sandbox Code Playgroud)

返回: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();
Run Code Online (Sandbox Code Playgroud)

返回: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");
            }
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

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

Vya*_*lav 1

首先,不要使用 onPeerConnected 等已弃用的方法。始终使用 CapabilityApi 方法。这就是污点!

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

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

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

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

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

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

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