1

我买了华为手表 2,因为我正在开发一个读取步数和心率的应用程序。在选择 Google Fitness API 之前,我想尝试直接从手表传感器访问原始数据。

无论我尝试什么,心率传感器似乎都无法正常工作。我已经在我的 AndroidManifest 文件中放入了“uses-permission android:name="android.permission.BODY_SENSORS"”。我的主要活动扩展了 WearableActivity 类并实现了 SensorEventListener 接口。

这就是我在 onCreate() 方法中关于传感器的内容:

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

    mSensorSteps = mSensorManager.getDefaultSensor(TYPE_STEP_COUNTER);
    mSensorHeart = mSensorManager.getDefaultSensor(TYPE_HEART_RATE);

    String sensor_error = getResources().getString(R.string.error_no_sensor);

    if (mSensorSteps == null) {
        mTextSensorSteps.setText(sensor_error);
    }
    if (mSensorHeart == null) {
        mTextSensorHeart.setText(sensor_error);
    }

如果无法检测到传感器,则有一个字符串资源显示“No Sensor”,并且步数和心率传感器都有自己的文本视图,mTextSensorSteps 和 mTextSensorHeart。

在 onStart() 和 onStop() 方法中,我已注册和取消注册传感器的侦听器。

这是我在 onSensorChanged() 方法中的内容(onAccuracyChanged() 方法为空):

@Override
public void onSensorChanged(SensorEvent event) {

    int sensorType = event.sensor.getType();
    float currentValue = event.values[0];

    switch (sensorType) {

        case Sensor.TYPE_STEP_COUNTER:
            // Event came from the steps sensor.
            mTextSensorSteps.setText(getResources().getString(R.string.steps_label, currentValue));
            break;

        case Sensor.TYPE_HEART_RATE:
            // Event came from the heart rate sensor.
            mTextSensorHeart.setText(getResources().getString(R.string.heart_label, currentValue));
            break;

        default:
            // do nothing
    }}

这些是我的字符串资源:

<string name="error_no_sensor">No Sensor</string>
<string name="heart_label">Heart: %1$.2f</string>
<string name="steps_label">Steps: %1$.2f</string>

该代码适用于除心率传感器之外的所有传感器。如果它是手表中不存在的传感器,我会收到“无传感器”错误。如果我用陀螺仪试试它就可以了。如果我用加速度计尝试它,它就可以工作。当我写 TYPE_HEART_RATE 时,文本视图只显示“心脏:%1$.2f”。

我什至尝试使用传感器的 ID 而不是名称,我知道 TYPE_STEP_COUNTER 是 19,TYPE_HEART_RATE 是 21。结果相同:它适用于步数、陀螺仪(我认为它的 ID 是 4 或类似的东西)、加速度计、但不是心率传感器。我什至尝试修改 onSensorChanged() 方法中的 Switch 案例,使其像这样工作:

if (sensorType == 21) {
        mTextSensorHeart.setText(getResources().getString(R.string.heart_label, currentValue));
    }

我卸下了开关盒,只是使用了一些 ifs,同样的事情。心率传感器是唯一不工作的。

我创建了另一个显示手表中传感器列表的 android 项目,我注意到心率传感器是唯一没有“vendor="Huawei SensorHub"”的传感器。这是我发现的:

{sensor
name="ADPD153GGRI",
vendor="ANALOG DEVICES",
version=1,
type=21,
maxRange=255.0
...
}

而所有其他传感器都有“Huawei SensorHub”作为供应商。

我在 Analog Devices 网站上找不到传感器模型(这是我找到的最接近的模型,但它并没有真正帮助),从这里我真的不知道还能做什么。可能因为是非原装华为传感器,所以传感器事件的 values[0] 数组不起作用?

我真的不知道该怎么办。

4

1 回答 1

1

在 API 23 中,身体传感器移至运行时权限。如果您进入设置、应用和通知、应用信息,请选择您的应用,然后选择权限。您应该会看到传感器权限已禁用。您可以在此处启用它以进行测试,但应实施此处概述的运行时权限模型。https://developer.android.com/training/articles/wear-permissions

于 2020-01-13T23:18:59.293 回答