Невозможно прослушать несколько типов данных датчика (шаги и расстояние) - PullRequest
0 голосов
/ 04 февраля 2019

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

...