尝试从模拟的移动设备向模拟的佩戴设备发送消息。我可以通过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,这使我相信它会返回手表以外的其他内容。
答案 0 :(得分:1)
首先,不要使用onPeerConnected等弃用的方法。 始终使用CapabilityApi方法。这是不可能的!
我有一个问题。您使用的是哪种Android Wear APK(手持设备上)文件?难道你不知道现代版Android Wear APK没用吗?它们无法正常工作。
如果您使用的是旧版API,则必须了解现代API(如CapabilityApi)不起作用。
如今,无法在模拟的可穿戴设备和模拟的手持设备之间建立稳定的连接。其中一个必须是一个真正的设备。
我建议的唯一解决方案是测试真正的可穿戴设备和手持设备的应用。
始终使用最新的GoogleServices库来测试,使用真实设备,使用未弃用的API。
在发布之前减少GoogleServices库版本,以使您的应用可用于未更新的设备。
在我的实践中,模拟器的工作非常奇怪。
答案 1 :(得分:0)
一个可能的问题可能如下:您正在抓取所有连接的节点,然后抓住第一个目标为您的消息。这很可能最终成为云节点(或者如果你有多个可穿戴设备),而不是你的手机。正确的方法是使用CapabilityApis找到发送消息的正确节点。在您的代码中,查看您选择用于确认它正在选择云的节点的node.toString(),以确保这是问题所在。
检查此相关的SO票证: