我正在为Wear创建一个应用程序,它有一个手机伴侣应用程序来执行一些较重的进程并进行API调用。
到目前为止,关于两个设备之间的通信,我一直在关注本教程 - http://android-wear-docs.readthedocs.io/en/latest/data.html
这使我的手机能够与手表通信,但现在我想知道我是如何以其他方式复制它的。
我在Wear应用程序上的当前代码是这样的(手机和手表上也有一个单独的监听器类):
public void sendTestMessage(View view)
{
String WEARABLE_DATA_PATH = "/wearable_data";
DataMap dataMap = new DataMap();
dataMap.putString("WATCH2PHONE TEST MESSAGE EVENT!", "1");
new SendToDataLayerThread(WEARABLE_DATA_PATH, dataMap).start();
}
class SendToDataLayerThread extends Thread
{
String path;
DataMap dataMap;
SendToDataLayerThread(String p, DataMap data)
{
path = p;
dataMap = data;
}
public void run()
{
PutDataMapRequest putDMR = PutDataMapRequest.create(path);
putDMR.getDataMap().putAll(dataMap);
PutDataRequest request = putDMR.asPutDataRequest();
DataApi.DataItemResult result = Wearable.DataApi.putDataItem(googleClient, request).await();
if (result.getStatus().isSuccess())
{
Log.v("myTag", "DataMap: " + dataMap + " sent successfully to data layer ");
}
else
{
Log.v("myTag", "ERROR: failed to send DataMap to data layer");
}
}
}
监听器类(对于手表,手机版本相同):
public class ListenerService extends WearableListenerService
{
@Override
public void onDataChanged(DataEventBuffer dataEvents)
{
DataMap dataMap;
for (DataEvent event : dataEvents)
{
Log.v("myTag", "DataMap received on device: " + DataMapItem.fromDataItem(event.getDataItem()).getDataMap());
}
}
}
因此,发送测试消息会将消息发送到图层并发送,但会被手表的监听服务接收。
我假设“String WEARABLE_DATA_PATH =”/ wearable_data“;”是什么导致它最终被手表接收,但我不确定要改变它以便让它正确发送。
答案 0 :(得分:1)
Data API在两个方向上的工作方式相同。在掌上电脑中使用的特定体系结构取决于您应用的结构,但在https://developer.android.com/training/wearables/data-layer/events.html#Listen的文档中可以很好地概述选项。
该页面还讨论了使用路径过滤收到的数据事件。同样,这取决于您的体系结构,但使用"/data_from_handheld"
和"/data_from_wearable"
之类的路径来区分不同方向的DataItem可能是合理的。或者您可以使用相同的路径,然后数据事件将出现在所有连接的设备上 - 这可能是您想要的也可能不是。
另一个常见的"陷阱":数据API事件仅在数据实际更改时触发。这是API处理实际通信的有效方式,但可能使开发变得困难。要强制它,只需包含一个总是不同的项目,例如:
dataMap.putLong("timestamp", System.nanoTime());
...但请务必在部署应用之前解决这个问题!