[英]Google-Fit Sensor.TYPE_STEP_COUNTER equivalent in Xamarin
[英]Retrieve HR-bpm with Google-Fit sensor api
我正在使用一个外部设备,该设备应该将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());
}
}
});
}
}
现在,这是我发现的最简单,最干净的心率读取方法;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.