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



我正在使用一个外部设备,它应该将TYPE_HEART_RATE_BPM发送到SENSORS_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是一个专用于服务中的传感器api的类。

但我似乎不能得到任何值,onDataPoint()不运行,当我改变我的请求:

SensorRequest request = new SensorRequest.Builder()
            .setDataType(DataType.TYPE_HEART_RATE_BPM)
            .setSamplingRate(1, TimeUnit.SECONDS)
            .build();
如果有人知道是什么问题,请告诉我。如果你能在我的代码中看到任何奇怪的地方,也请告诉我。

谢谢!

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

您可以从以下链接阅读FitnessSensorService。https://developers.google.com/fit/android/new-sensors

我找到了一个解决方案。显然,我需要找到并注册我想要的数据来源。

所以我仍然使用客户端,请求等的"相同"结构,但不是使用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());
                        }
                    }
                });
    }
}

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

相关内容

  • 没有找到相关文章

最新更新