Получить текущие шаги дня во время datapointListener Google Fit

Используя следующий код, я получаю совокупные шаги, так как я начал записывать значения. Но я бы хотел показать только шаги текущего дня вместо кумулятивных.

@Override
public void onConnected(@Nullable Bundle bundle) {
    DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder()
            .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)
            .setDataSourceTypes(DataSource.TYPE_RAW)
            .build();

    ResultCallback<DataSourcesResult> dataSourcesResultCallback = new ResultCallback<DataSourcesResult>() {
        @Override
        public void onResult(DataSourcesResult dataSourcesResult) {
            for( DataSource dataSource : dataSourcesResult.getDataSources() ) {
                if(DataType.TYPE_STEP_COUNT_CUMULATIVE.equals(dataSource.getDataType())) {
                    registerStepsDataListener(dataSource, DataType.TYPE_STEP_COUNT_CUMULATIVE);
                }
            }
        }
    };

    Fitness.SensorsApi.findDataSources(googleApiClient, dataSourceRequest)
            .setResultCallback(dataSourcesResultCallback);

    Fitness.RecordingApi.subscribe(googleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
            .setResultCallback(subscribeResultCallback);
}

//onDataPointListener
@Override
public void onDataPoint(DataPoint dataPoint) {
    for( final Field field : dataPoint.getDataType().getFields() ) {
        final Value value = dataPoint.getValue( field );
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvSteps.setText("Field: " + field.getName() + " Value: " + value.toString());
            }
        });
    }
}

Я попытался заменить константы dataType, но это не сработало. Вызов метода readData с использованием History API в DataPointListener не удался. В то время как вы получаете желаемый результат, он сильно отстает, и не следует делать такие вещи.

Другой метод заключается в смене дня, я получаю данные для совокупных шагов в полночь, а затем сохраняю их в SharedPreferences. Затем вычтите это число во время onDatapoint из совокупного показанного.

Но есть ли лучший метод, чем этот?

2 ответа

Решение

На основании шага 2: Отображение данных за сегодня в API Google Fit History, Google Fit для Android: History API упоминает о:

Один из наиболее распространенных вариантов использования - это данные за текущий день. К счастью, Google сделал это легко, добавив Fitness.HistoryApi.readDailyTotal вызов, который создает DailyTotalResult объект, содержащий данные, собранные за день.

Пример кода, который регистрирует шаг пользователя за день:

private void displayStepDataForToday() {
    DailyTotalResult result = Fitness.HistoryApi.readDailyTotal( mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA ).await(1, TimeUnit.MINUTES);
    showDataSet(result.getTotal());
}

Вы также можете попробовать решение, приведенное в этом посте SO - Как получить количество шагов в Google Fit REST API, например в приложении Google Fit?, Я надеюсь, что это работает для вас.

  1. Определите, открыто ли приложение в первый раз. Если true, сохраните значение шага, показанное в первый раз в методе onDataPoint. Данные этого шага содержат информацию о шагах, записанных Google Fit ранее (через другие приложения или через Google Fit). Сохраните значение в общих настройках.
  2. Затем вычтите сохраненные шаги из показанных текущих шагов. Это равно шагу текущего дня. // Для ежедневного использования
  3. Определите, изменился ли день с момента последнего запуска приложения.
  4. Если это так, то используйте API readData от googlefit в течение 1 дня и получите шаги.
  5. Добавьте эти шаги к сохраненным шагам. Таким образом, сохраненные шаги увеличиваются со значениями шагов предыдущего дня.
  6. В onDataPoint вычтите значение сохраненных шагов из показанного значения шагов.

Примечание: вы должны учитывать, что приложение не открывалось в течение нескольких дней. Google Fit все еще должен записывать шаги. Сохраненные шаги должны складывать шаги всех дней, когда приложение не было открыто.

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