如果我的 Huawei Watch 2 不是原装 Sensor,如何访问它的心率传感器?

How can I access the heart rate sensor of my Huawei Watch 2 if it is not an original Huawei Sensor?

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

无论我怎样尝试,心率传感器似乎都不起作用。我已经将 "uses-permission android:name="android.permission.BODY_SENSORS"" 放入我的 AndroidManifest 文件中。我的主要 activity 扩展了 WearableActivity class 并实现了 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>

该代码适用于除心率传感器以外的所有传感器。如果它是手表中不存在的传感器,我会收到 "No Sensor" 错误。如果我用陀螺仪试一下它就可以了。如果我用加速度计尝试它,它就可以工作。当我写 TYPE_HEART_RATE 时,textview 只显示 "Heart: %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));
    }

我删除了 switch case 并且只使用了一些 ifs,同样的事情。心率传感器是唯一不工作的传感器。

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

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

而所有其他传感器的供应商都是 "Huawei SensorHub"。

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

真不知道该怎么办

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