Как получить данные за все время из Google Fit API?
Мне нужно узнать количество шагов, пройденных пользователем с тех пор, как он начал использовать приложение до сегодняшнего дня. Как мне сделать это с помощью API Google FIT?
3 ответа
У меня был этот вопрос сам. Что я сделал, так это построил DataRequest с:
endTime сейчас (сегодня):
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
и время начала выпуска первой версии приложения Google Fit:
cal.set(2014, 9, 28);
cal.set(Calendar.HOUR_OF_DAY, 0); //so it get all day and not the current hour
cal.set(Calendar.MINUTE, 0); //so it get all day and not the current minute
long startTime = cal.getTimeInMillis();
Сборка DataReadRequest: (вы можете включить, если хотите)
DataReadRequest readRequest = new DataReadRequest.Builder()
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.read(DataType.AGGREGATE_STEP_COUNT_DELTA)
.enableServerQueries()
.build();
Таким образом, вы получите все данные, начиная с 28 октября 2014 года
Вы можете использовать API истории фитнеса, который позволяет вашему приложению выполнять массовые операции в магазине фитнеса, такие как чтение, вставка, обновление и удаление данных фитнеса.
Вам нужно создать DataReadRequest
экземпляр для чтения данных из истории фитнеса.
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.add(Calendar.WEEK_OF_YEAR, -1);
long startTime = cal.getTimeInMillis();
java.text.DateFormat dateFormat = DateFormat.getDateInstance();
Log.e("History", "Range Start: " + dateFormat.format(startTime));
Log.e("History", "Range End: " + dateFormat.format(endTime));
//Check how many steps were walked and recorded in the last 7 days
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
Вы также можете сгруппировать эти данные вместе в Bucket
объекты по времени или сеансам. В этом примере вы запрашиваете агрегированные данные шага за последнюю неделю и собираете эти данные по дням.
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.add(Calendar.HOUR_OF_DAY, -1);
long startTime = cal.getTimeInMillis();
DataSource dataSource = new DataSource.Builder()
.setAppPackageName(this)
.setDataType(DataType.TYPE_STEP_COUNT_DELTA)
.setName("Step Count")
.setType(DataSource.TYPE_RAW)
.build();
int stepCountDelta = 1000000;
DataSet dataSet = DataSet.create(dataSource);
DataPoint point = dataSet.createDataPoint()
.setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS);
point.getValue(Field.FIELD_STEPS).setInt(stepCountDelta);
dataSet.add(point);
Этот пример из этого учебника использует агрегированные точки данных, где каждый DataPoint
представляет количество шагов, пройденных за день.
Проверьте это связанные вопросы
Я попробовал решение, данное JPL, и оно сработало для меня, не используйте атрибут .bucketByTime(), в ответ вы получите List of DataSet
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.set(2014, 9, 28);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
long startTime = cal.getTimeInMillis();
DataReadRequest readRequest = new DataReadRequest.Builder()
.read(DataType.TYPE_STEP_COUNT_DELTA)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.enableServerQueries()
.build();
В ответ используйте:
if (response.getDataSets().size()>0){
for (DataSet dataSet :response.getDataSets())
dumpDataSet(dataSet);
}