Я хотел бы получить доступ к API Google Fit Sensors для Android, чтобы обновлять шаги и пройденное расстояние в режиме реального времени.Однако я не могу одновременно прослушивать оба типа данных.Если я слушаю только один, он работает нормально.
Я нашел эту тему, описывающую ту же проблему: Google Fit: не удается обновить шаг и расстояние в режиме реального времени .Однако принятый ответ не работает, и он использует старый GoogleApiClient вместо более нового GoogleApi.Я следовал этому руководству: Доступ к необработанным данным датчика .
Это мой код:
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 для выбора между точками данных шага и расстояния.Однако этот прослушиватель (хотя и зарегистрирован дважды для обоих типов данных) получает только точки данных для одного из двух типов данных.