我的目标
我正在创建一个应用程序/包,佩戴者和手持设备都可以在数据层上进行更改,并收到此类更改的通知。我使用的是GoogleApiClient和DataApi.DataListener接口。
当前进度
截至目前,我的可穿戴设备上的一个操作成功地更新了数据层中的计数,然后通过显示新的计数检测并反映在手持设备中。
问题
检测只有一种方式。虽然可穿戴设备发起的更改成功更新了手持设备上的计数,但在可穿戴设备上未检测到手持设备发起的变更。
我尝试过的
我在StackExchange和谷歌上看了几个小时,还没有发现可穿戴设备和手持设备都在更新数据层对象的情况。在大多数情况下,只有手持设备在更新某些东西,而可穿戴设备在检测,反之亦然。单向交流对我来说很好。我需要双向交流。
手持代码段
public class ListenActivity extends Activity implements
DataApi.DataListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
// ConnectionCallback methods, UI methods not included in snippet
private static final String COUNT_KEY = "com.example.count";
private int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listen);
handler.post(displayCounts);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
@Override
public void onDataChanged(DataEventBuffer dataEvents)
{
for (DataEvent event : dataEvents)
{
if (event.getType() == DataEvent.TYPE_CHANGED)
{
DataItem item = event.getDataItem();
if (item.getUri().getPath().compareTo("/count") == 0)
{
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
count = dataMap.getInt(COUNT_KEY);
}
}
}
}
// A UI button calls this method to reset the count, but the Wearable isn't calling its onDataChanged() method.
public void resetCount(View view)
{
PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
putDataMapReq.getDataMap().putInt(COUNT_KEY, 0);
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult =
Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq);
} }
可穿戴代码片段
public class WearListenActivity extends Activity implements
DataApi.DataListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
// ConnectionCallback methods, UI methods not included in snippet
private static final String COUNT_KEY = "com.example.count";
private int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDismissOverlay = (DismissOverlayView) findViewById(R.id.dismiss_overlay);
mDismissOverlay.showIntroIfNecessary();
mGestureDetector = new GestureDetectorCompat(this, new GestureListener());
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApiIfAvailable(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
// This method is never called on the Wearable.
// It isn't detecting the changes made by Handheld's resetCount() method?
@Override
public void onDataChanged(DataEventBuffer dataEvents)
{
for (DataEvent event : dataEvents)
{
if (event.getType() == DataEvent.TYPE_CHANGED)
{
DataItem item = event.getDataItem();
if (item.getUri().getPath().compareTo("/count") == 0)
{
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
count = dataMap.getInt(COUNT_KEY);
}
}
}
}
// User taps the screen, this method is called. Works perfectly fine since handheld updates its counts.
private void updateDataLayer()
{
PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
putDataMapReq.getDataMap().putInt(COUNT_KEY, count);
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult =
Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq);
} }
这可能是因为您正在侦听"活动"中的事件。我正在使用WearableListenerService,它在两个方面都适用于。
您可以在这里找到一个示例:处理数据层事件