【问题标题】:Android Two Way Communication Between Handheld and WearableAndroid手持和可穿戴之间的双向通信
【发布时间】:2015-06-24 20:05:33
【问题描述】:

我的目标
我正在创建一个应用程序/包,其中可穿戴设备和手持设备都能够在数据层上进行更改并收到此类更改的通知。我正在使用 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 的任何特定原因,无论您的活动是否正在运行都可以?
  • 我有一个应用程序可以做到这一点。两边的代码是一样的,我有一个共享的数据管理器类,两个活动都使用。要记住几件事;即使是进行更改的活动也会通知您的活动,仅当数据与之前的数据不同时才会发送通知(两次发送相同的字符串将被忽略),有时数据映射中存在陈旧数据。对于每个数据项,我存储了一个设备 ID 和时间戳来说明这一点。发布您的代码的更多代码,我们也许能够找到问题。
  • @ianhanniballake 是的,我在 onConnected() 方法中添加了监听器。我在每个活动中注册我的监听器的原因是因为我正在实现的是一个更大应用程序的单个模块,而应用程序的其余部分不需要数据监听功能。但是,我正在考虑使用 Wea​​rableListenerService,基于你所有的答案/cmets。
  • @blackcj 感谢您的提醒。我通过多次单步执行代码弄清楚了所有这些事情。我将继续执行每个人的建议,包括您的建议,并使用单独/共享的数据管理器类。

标签: android wear-os data-synchronization google-data-api android-wear-data-api


【解决方案1】:

这可能是因为您正在监听 Activity 中的事件。 我正在使用WearableListenerService,它适用于两种方式。

你可以在这里找到一个例子:Handling Data Layer Events

【讨论】:

  • 对于扩展 WearableListenerService 的类,您是在 onCreate() 中立即连接到 GoogleApiClient 还是仅连接以发送数据,如您链接的示例中所示?
  • 我尝试扩展 WearableListenerService 并设法让事情正常进行。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多