Получить последние прогулки из Google Fit Android API
В настоящее время я пытаюсь разработать собственное приложение для Android, которое получает информацию из History_API. Я уже в состоянии получить калории, ежедневные шаги и активное время. Теперь я думал о том, чтобы перейти на следующий уровень и попытаться просмотреть различные типы действий, извлеченные из истории API, используя код ниже:
protected Void doInBackground(Void... params) {
DataReadRequest readRequest = queryFitnessData();
DataReadResult dataReadResult =
Fitness.HistoryApi.readData(mGoogleApiClient, readRequest).await(1, TimeUnit.MINUTES);
getData(dataReadResult);
return null;
}
Это функция, которая определяет запрос:
private DataReadRequest queryFitnessData() {
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
long endTime = cal.getTimeInMillis();
cal.add(Calendar.WEEK_OF_MONTH, -1);
long startTime = cal.getTimeInMillis();
DataSource ACTIVITY_SEGMENT = new DataSource.Builder()
.setDataType(DataType.TYPE_ACTIVITY_SEGMENT)
.setType(DataSource.TYPE_DERIVED)
.build();
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
.bucketByTime(5, TimeUnit.MINUTES)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
return readRequest;
}
И это, похоже, хорошо работало после обеда, но при дальнейшей работе над ним больше не отображаются представления. Поиск в файлах журнала показал, что корзины возвращали все, где было указано, типа "in_vehicle". Что имеет смысл, почему приведенный ниже код не добавляет представления в мой массив.
private void getData(DataReadResult result) {
if (result.getBuckets().size() > 0) {
Log.i(TAG, "Bucket size: " + result.getBuckets().size());
for(Bucket bucket : result.getBuckets()) {
long activeTime = bucket.getEndTime(TimeUnit.MINUTES) - bucket.getStartTime(TimeUnit.MINUTES);
Log.i(TAG, bucket.getActivity());
switch (bucket.getActivity()) {
case "walking":
Log.i(TAG, "Adding a walking card");
activityData.add(new CustomActivityCard("Walking","Place, 27 juli",Long.toString(activeTime) + " minutes","5 kilometers","2340 steps","1340 calories"));
break;
case "running":
Log.i(TAG, "Adding a running card");
activityData.add(new CustomActivityCard("Running","Place, 27 juli",Long.toString(activeTime) + " minutes","5 kilometers","2340 steps","1340 calories"));
break;
case "biking":
Log.i(TAG, "Adding a cycling card");
activityData.add(new CustomActivityCard("Cycling","Place, 27 juli",Long.toString(activeTime) + " minutes","5 kilometers","2340 steps","1340 calories"));
break;
}
}
}
}
Я не могу понять, почему код отображал ходьбу и бег в полдень, и вдруг возвращает только те действия, которые были у меня за рулем. Одно из возможных решений, которое я могу придумать, заключается в том, что мое приложение не подписано ни на один из типов данных. Итак, мои вопросы:
- Нужно ли подписывать мое приложение, чтобы можно было получать информацию о деятельности (например, ходьбе)?
- Как мне восстановить все действия, выполненные в день или в течение недели?
1 ответ
Я еще не уверен, что подписки, предложенные в комментариях, имели какое-то значение, но одно, что определенно помогло, чтобы найти решение, - это изменить фрагмент кода ниже:
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
.bucketByTime(5, TimeUnit.MINUTES)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
Для чего-то вроде DataRequest, приведенного ниже, это дало мне возможность получить информацию о прогулках за текущий день.
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
.bucketByActivitySegment(7, TimeUnit.MINUTES)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
Надеюсь, это поможет и другим!