安卓手持设备和可穿戴设备之间的双向通信

3

我的目标
我正在创建一个应用/包,其中手表和手持设备都能够对数据层进行更改并被通知这些更改。 我正在使用GoogleApiClient和DataApi.DataListener接口。

当前进展
截至目前,手表上的操作成功更新了数据层中的计数器,然后通过显示新计数来检测并反映在手持设备上。

问题
检测只能单向工作。 虽然由手表发起的更改成功地更新了手持设备上的计数,但由手持设备发起的更改却无法在手表上检测到。

我尝试过的
我在StackExchange和Google上寻找了几个小时,但没有找到手表和手持设备都在更新数据层对象的情况。 在大多数情况下,只有手持设备更新了某些内容,而手表进行检测,或反之亦然。 对于我来说,单向通信已经足够好了。我需要双向。

手持设备代码片段

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);
} }

您在可穿戴设备中是否有更多调用DataApi.addListener的代码(例如在“onConnected()”方法中)?为什么要在每个活动中注册侦听器,而不是使用WearableListenerService来工作,无论您的活动是否正在运行,有什么特别的原因? - ianhanniballake
1
我有一个应用程序可以做到这一点。代码在两个方面都是相同的,我有一个共享的数据管理器类,两个活动都使用它。有几件事需要记住:即使是进行更改的那个活动,您的活动也会收到通知;只有在数据与之前不同的情况下才会发送通知(发送相同的字符串两次将被忽略);有时数据映射中存在过期数据。为了解决这个问题,对于每个数据项,我存储设备ID和时间戳。请发布更多代码,我们可能能够找到问题所在。 - blackcj
@ianhanniballake 是的,我在onConnected()方法中添加了Listener。我在每个活动中注册监听器的原因是,我正在实现一个更大应用程序的单个模块,其余部分不需要数据监听功能。但是,考虑到您所有的答案/评论,我正在考虑使用WearableListenerService。 - meta.orphic
@blackcj 感谢你的提醒。我通过多次调试代码找出了所有问题。我会采纳大家的建议,包括你的,使用一个独立/共享数据管理类。 - meta.orphic
1个回答

2

对于扩展WearableListenerService的类,您是在onCreate()中立即连接到GoogleApiClient,还是仅在发送数据时连接,就像您链接的示例一样? - meta.orphic
我尝试扩展WearableListenerService并成功地使其运作。非常感谢! - meta.orphic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接