使用 Google-Fit 传感器 api 检索 HR-bpm

Retrieve HR-bpm with Google-Fit sensor api

我正在使用一个外部设备,它应该发送 TYPE_HEART_RATE_BPMSENSORS_API。 我可以使用此代码检索步骤:

客户

mClient = new GoogleApiClient.Builder(ApLifeAid.getAppContext())
            .addApi(Fitness.SENSORS_API)
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

请求

SensorRequest request = new SensorRequest.Builder()
            .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
            .setSamplingRate(1, TimeUnit.SECONDS)
            .build();

然后使用Fitness.SensorsApi.add(mClient, request, this);。在这种情况下,this 是一个 class 专用于服务中的传感器 api。

但我似乎根本无法获得任何值,onDataPoint() 没有 运行,当我将请求更改为:

SensorRequest request = new SensorRequest.Builder()
            .setDataType(DataType.TYPE_HEART_RATE_BPM)
            .setSamplingRate(1, TimeUnit.SECONDS)
            .build();

如果有人知道问题出在哪里,请告诉我。如果您在我的代码中看到任何其他奇怪的地方,也请告诉我。

谢谢!

首先你必须检查你的数据源是否可用。 如果数据源不可用并且您的传感器是蓝牙经典设备并且也不支持蓝牙 GATT 配置文件,那么您需要实施 FitnessSensorService 来注册您的数据源。

您可以从以下link了解有关 FitnessSensorService 的信息。 https://developers.google.com/fit/android/new-sensors

我找到了解决办法。显然我需要找到并注册我希望数据来自的来源。

所以我仍然使用客户端、请求等的 "same" 构造,但我没有使用 SensorsApi.add,而是使用 findDataSources。 (此外,FITNESS_BODY_READ 似乎更准确并且效果很好)

private void buildSensors() {
    mClient = new GoogleApiClient.Builder(ApLifeAid.getAppContext())
            .addApi(Fitness.SENSORS_API)
            .addScope(new Scope(Scopes.FITNESS_BODY_READ))
            .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    DataSourcesRequest dataSourcesRequest = new DataSourcesRequest.Builder()
            .setDataTypes(DataType.TYPE_HEART_RATE_BPM/*,
                    DataType.TYPE_STEP_COUNT_DELTA*/)
            .setDataSourceTypes(DataSource.TYPE_RAW) // data type, raw or derived?
            .build();

    Fitness.SensorsApi.findDataSources(mClient, dataSourcesRequest).setResultCallback(this);
}

然后 setResultCallback(this) 会调用以下命令,我会在其中找到符合条件的来源并为其添加侦听器和采样率。

@Override
public void onResult(DataSourcesResult dataSourcesResult) {
    // On New Source Result
    for (final DataSource dataSource : dataSourcesResult.getDataSources()) {

        // Request updates from this source, samplingRate
        SensorRequest sensorRequest = new SensorRequest.Builder()
                .setDataSource(dataSource) // Optional but recommended for custom data sets.
                .setDataType(dataSource.getDataType()) // Can't be omitted.
                .setSamplingRate(1, TimeUnit.SECONDS)
                .build();

        Log.i(TAG, "Fitness.SensorsApi.add for " + dataSource.toString() + " and type " + dataSource.getDataType().getName());
        Fitness.SensorsApi.add(mClient, sensorRequest, this)
                //Can be removed later
                .setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(Status status) { // This might be important later on "Cannot register listener to source"
                        if (status.isSuccess()) {
                            Log.i(TAG, "Listener registered!");
                        } else {
                            Log.e(TAG, "Unable to register listener for source: " + dataSource.toString());
                        }
                    }
                });
    }
}

现在这是我发现的最简单、最干净的读取心率的方法 ;)