我正在使用一个外部设备,它应该将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());
}
}
});
}
}
这是我现在发现的最简单、最干净的读取心率的方法;)