未调用 WearableListenerService onMessageReceived()
WearableListenerService onMessageReceived() not called
在 phone 设备上,我有一个 WearableListenerService 侦听来自 Android Wear 设备的输入。
我同时使用 DataItems 和 Messages。两个设备之间的 DataItems 同步很好,但是,我在 phone.
上接收消息时遇到问题
我试过以下方法:
- 已确认 Wear 已发送消息
- 检查包名称是否相同
- 检查签名是否相同(都是Android调试)
仍然没有在DataLayerListenerService 中调用onMessageReceived。最初,我使用的是 activity 并扩展了 MessageListener,除了它短暂工作的一点外,它也没有工作。
Android穿码
public static void sendMessageToDevice(final String commandPath, final byte[] additionalData)
{
// Separate thread from UI thread
new Thread(new Runnable()
{
@Override
public void run()
{
String nodeId = null;
// Find first connected device id
NodeApi.GetConnectedNodesResult result =
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
List<Node> nodes = result.getNodes();
if (nodes.size() > 0)
{
nodeId = nodes.get(0).getId();
}
if (nodeId != null)
{
Wearable.MessageApi.sendMessage(mGoogleApiClient, nodeId,
commandPath, additionalData).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>()
{
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult)
{
if (!sendMessageResult.getStatus().isSuccess())
{
System.err.println("Message " + commandPath + " could not be sent.");
}
}
});
System.out.println("Command path is: " + commandPath);
}
}
}).start();
}
Android 设备代码
public class DataLayerListenerService extends WearableListenerService
{
@Override
public void onMessageReceived(MessageEvent messageEvent)
{
System.out.println("Received command");
String command = messageEvent.getPath();
System.out.println("Received command is: " + command);
if (command.contains("/mobile/input/"))
{
System.out.println(command);
}
}
@Override
public void onDataChanged(DataEventBuffer dataEvents)
{
for (DataEvent event : dataEvents)
{
if (event.getType() == DataEvent.TYPE_CHANGED)
{
DataItem item = event.getDataItem();
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
String itemPath = item.getUri().getPath();
if (itemPath.equals("/mobile/input/level"))
{
int level = dataMap.getInt("level");
MainActivity.readLevel(level);
}
}
}
}
}
一个可能的问题可能如下:您正在抓取所有连接的节点,然后抓取第一个作为消息目标的节点。这很可能最终成为云节点(或者另一个可穿戴设备,如果你有多个)而不是你的 phone。正确的方法是使用 CapabilityApis 找到将消息发送到的正确节点。在您的代码中,查看您选择的节点的 node.toString() 以确认它正在选择云,以确保这是问题所在。
在 phone 设备上,我有一个 WearableListenerService 侦听来自 Android Wear 设备的输入。
我同时使用 DataItems 和 Messages。两个设备之间的 DataItems 同步很好,但是,我在 phone.
上接收消息时遇到问题我试过以下方法:
- 已确认 Wear 已发送消息
- 检查包名称是否相同
- 检查签名是否相同(都是Android调试)
仍然没有在DataLayerListenerService 中调用onMessageReceived。最初,我使用的是 activity 并扩展了 MessageListener,除了它短暂工作的一点外,它也没有工作。
Android穿码
public static void sendMessageToDevice(final String commandPath, final byte[] additionalData)
{
// Separate thread from UI thread
new Thread(new Runnable()
{
@Override
public void run()
{
String nodeId = null;
// Find first connected device id
NodeApi.GetConnectedNodesResult result =
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
List<Node> nodes = result.getNodes();
if (nodes.size() > 0)
{
nodeId = nodes.get(0).getId();
}
if (nodeId != null)
{
Wearable.MessageApi.sendMessage(mGoogleApiClient, nodeId,
commandPath, additionalData).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>()
{
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult)
{
if (!sendMessageResult.getStatus().isSuccess())
{
System.err.println("Message " + commandPath + " could not be sent.");
}
}
});
System.out.println("Command path is: " + commandPath);
}
}
}).start();
}
Android 设备代码
public class DataLayerListenerService extends WearableListenerService
{
@Override
public void onMessageReceived(MessageEvent messageEvent)
{
System.out.println("Received command");
String command = messageEvent.getPath();
System.out.println("Received command is: " + command);
if (command.contains("/mobile/input/"))
{
System.out.println(command);
}
}
@Override
public void onDataChanged(DataEventBuffer dataEvents)
{
for (DataEvent event : dataEvents)
{
if (event.getType() == DataEvent.TYPE_CHANGED)
{
DataItem item = event.getDataItem();
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
String itemPath = item.getUri().getPath();
if (itemPath.equals("/mobile/input/level"))
{
int level = dataMap.getInt("level");
MainActivity.readLevel(level);
}
}
}
}
}
一个可能的问题可能如下:您正在抓取所有连接的节点,然后抓取第一个作为消息目标的节点。这很可能最终成为云节点(或者另一个可穿戴设备,如果你有多个)而不是你的 phone。正确的方法是使用 CapabilityApis 找到将消息发送到的正确节点。在您的代码中,查看您选择的节点的 node.toString() 以确认它正在选择云,以确保这是问题所在。