我想访问适用于Android的Google Fit Sensors API,以实时更新步数和行进距离。但是,我无法同时收听两种数据类型。如果我只听一听,效果很好。
我发现此主题描述了相同的问题:Google Fit: Cannot update both step and distance in real-time。但是,接受的答案无效,它使用旧的GoogleApiClient而不是较新的GoogleApi。我遵循了本教程:Access Raw Sensor Data。
这是我的代码:
private void findDataSources() {
Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.findDataSources(
new DataSourcesRequest.Builder()
.setDataTypes(DataType.TYPE_STEP_COUNT_DELTA, DataType.TYPE_DISTANCE_DELTA)
.setDataSourceTypes(DataSource.TYPE_RAW, DataSource.TYPE_DERIVED)
.build())
.addOnSuccessListener(
new OnSuccessListener<List<DataSource>>() {
@Override
public void onSuccess(List<DataSource> dataSources) {
for (DataSource dataSource : dataSources) {
if (dataSource.getStreamName().equals("live_distance_from_steps") || dataSource.getStreamName().equals("live_step_deltas")) {
registerListener(dataSource);
}
}
}
});
}
private void registerListener(DataSource dataSource) {
if (dataSource.getDataType().equals(DataType.TYPE_STEP_COUNT_DELTA)) {
myStepCountListener = new OnDataPointListener() {
@Override
public void onDataPoint(DataPoint dataPoint) {
// Do something with the steps
}
};
Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.add(new SensorRequest.Builder()
.setDataSource(dataSource)
.setSamplingRate(750, TimeUnit.MILLISECONDS)
.build(),
myStepCountListener)
.addOnCompleteListener(
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
System.out.println("Listener registered!");
}
}
});
} else if (dataSource.getDataType().equals(DataType.TYPE_DISTANCE_DELTA)) {
myDistanceListener = new OnDataPointListener() {
@Override
public void onDataPoint(DataPoint dataPoint) {
// Do something with the distance
}
};
Fitness.getSensorsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.add(new SensorRequest.Builder()
.setDataSource(dataSource)
.setSamplingRate(900, TimeUnit.MILLISECONDS)
.build(),
myDistanceListener)
.addOnCompleteListener(
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
System.out.println("Listener registered!");
}
}
});
}
}
控制台输出是Listener registered!
的两倍。因此它似乎可行,但是只调用了一种onDataPoint
方法(一种随机发生)。
如上所述,如果删除dataSource.getStreamName().equals("live_step_deltas")
或"live_distance_from_steps"
,一切正常,但我只能得到一种数据类型。
我已经尝试两次注册相同的侦听器,并在该侦听器中实现if-else-clause来决定步长和距离数据点之间的关系。但是,这个侦听器(即使为两种数据类型注册了两次)也仅接收两种数据类型之一的数据点。