Невозможно прослушать несколько типов данных датчика (шаги и расстояние)

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

0 ответов

Другие вопросы по тегам