Получить текущие шаги дня во время 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?, Я надеюсь, что это работает для вас.
- Определите, открыто ли приложение в первый раз. Если true, сохраните значение шага, показанное в первый раз в методе onDataPoint. Данные этого шага содержат информацию о шагах, записанных Google Fit ранее (через другие приложения или через Google Fit). Сохраните значение в общих настройках.
- Затем вычтите сохраненные шаги из показанных текущих шагов. Это равно шагу текущего дня. // Для ежедневного использования
- Определите, изменился ли день с момента последнего запуска приложения.
- Если это так, то используйте API readData от googlefit в течение 1 дня и получите шаги.
- Добавьте эти шаги к сохраненным шагам. Таким образом, сохраненные шаги увеличиваются со значениями шагов предыдущего дня.
- В onDataPoint вычтите значение сохраненных шагов из показанного значения шагов.
Примечание: вы должны учитывать, что приложение не открывалось в течение нескольких дней. Google Fit все еще должен записывать шаги. Сохраненные шаги должны складывать шаги всех дней, когда приложение не было открыто.