Невозможно прослушать несколько типов данных датчика (шаги и расстояние)
Я хотел бы получить доступ к 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 для выбора между точками данных шага и расстояния. Однако этот прослушиватель (даже если он зарегистрирован два раза для обоих типов данных) получает только точки данных для одного из двух типов данных.