【问题标题】:WearableSensorListener onDataChanged is never calledWearableSensorListener onDataChanged 永远不会被调用
【发布时间】:2017-03-21 10:46:08
【问题描述】:

我最近开始在 Android 设备上工作,我想从 Android Watch 收集传感器数据。

我成功使用了消息 API,但数据 API 对我不起作用。我查过了:

https://stackoverflow.com/a/34175410/2487227

OnDataChanged is never called

Android Wear onDataChanged isn't called

但没有一个对我有用。

我的代码:

@Override
public void onCreate() {
    super.onCreate();
    // sensor registration
    // ......
    googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    googleApiClient.connect();
    Log.i(this.getClass().toString(), "Google API Client connected");
}

private void sendSensorResult(SensorEvent event) {
    if (!googleApiClient.isConnected())
        googleApiClient.connect();

    PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(DATA_API_PATH);

    putDataMapRequest.getDataMap().putLong("UNIX_TIME", System.currentTimeMillis());
    putDataMapRequest.getDataMap().putInt("TYPE", event.sensor.getType());
    // nanosecond
    putDataMapRequest.getDataMap().putLong("TIME", event.timestamp);
    putDataMapRequest.getDataMap().putFloatArray("DATA", event.values);

    PutDataRequest request = putDataMapRequest.asPutDataRequest().setUrgent();
    Wearable.DataApi.putDataItem(googleApiClient, request)
            .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                @Override
                public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
                    if (dataItemResult.getStatus().isSuccess()) {
                        Log.i(this.getClass().toString(), "Sent: " + event.toString());
                    } else {
                        Log.i(this.getClass().toString(), "FAILED TO SEND: " + event.toString());
                    }
                }
            });
}

在手机上:

public void onDataChanged(DataEventBuffer dataEvents) {
    Log.i(this.getClass().toString(), "Got data at " + System.currentTimeMillis());
    for (DataEvent dataEvent : dataEvents) {
        Log.i(this.getClass().toString(), "Got event: " + dataEvent.toString());
        if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
            DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
            String path = dataEvent.getDataItem().getUri().getPath();
            if (path.equals(DATA_API_PATH)) {
                int type = dataMap.getInt("TYPE");
                long time = dataMap.getLong("TIME");
                float[] data = dataMap.getFloatArray("DATA");
                String message = String.format(Locale.UK, "TYPE: %d, TIME: %d, DATA: %s",
                        type,
                        time,
                        Arrays.toString(data));

                showSensorResult(message);
            }
        }
    }
}

电话AndroidManifest.xml:

<service
        android:name=".WearableSensorListener"
        android:enabled="true"
        android:exported="true">
    <intent-filter>
        <action android:name="com.google.android.gms.wearable.DATA_CHANGED"/>
        <data android:host="*"
              android:scheme="wear"
              android:pathPrefix="/wearable-sensor"/>
    </intent-filter>
</service>

我可以从手表上看到日志,但手机上没有显示任何内容。

可穿戴设备和手机的applicationIds是一样的。

我是否需要任何额外的权限才能使用 Data API?

【问题讨论】:

标签: android wear-os android-wear-notification


【解决方案1】:

尽可能早地使用GooglePlayServices 版本。

打开 .\Sdk\extras\google\m2repository\com\google\android\gms\play-services-wearable\ 并使用,例如,8.3.0。查看您的穿戴设备的 GooglePlayServices 版本。它的数量必须大于您使用的数量。

我认为您的实施不正确。这是错误的。

private void sendSensorResult(SensorEvent event) {
    if (!googleApiClient.isConnected())
        googleApiClient.connect();
///....
Wearable.DataApi.putDataItem(googleApiClient, request)

我的意思是你必须等待连接。所以,只在onConnected回调之后使用putDataItem

【讨论】:

  • 我的手表和手机都在使用Google Play Services 10.2.98。将其改回10.0.18.3.0 会使应用无法启动。
  • @FrederickZhang,你可以发布你的失败日志吗?
  • 使用8.3.0。电话:paste.kde.org/p6eugmv1o。观看:只显示“很遗憾,HelloWear 已停止”,没有任何日志。
  • 你能发布 gradle 文件吗? @FrederickZhang
  • @FrederickZhang ,您似乎没有正确实现此 lib 版本。尝试清理/构建项目
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2013-10-12
  • 2012-03-27
  • 2013-08-29
  • 2013-11-03
  • 1970-01-01
  • 2015-05-06
相关资源
最近更新 更多