Получить последние прогулки из 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. Нужно ли подписывать мое приложение, чтобы можно было получать информацию о деятельности (например, ходьбе)?
  2. Как мне восстановить все действия, выполненные в день или в течение недели?

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();

Надеюсь, это поможет и другим!

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