Исторический API Google Fit не дает ответа

avatar
Alex Fedorenko
8 августа 2021 в 20:38
120
1
0

Я пытаюсь получить данные Heart Bit за определенный период времени. Я разбиваю временной диапазон на несколько меньших временных диапазонов, например каждый день длиной. Итак, если бы я запросил данные за последние 5 дней, он предоставил бы 5-временные диапазоны. Все эти данные о временных диапазонах хранятся в списке данных GoogleFitReadRequestData.

public class GoogleFitReadRequestData {
    private DataType dataType;
    private long startTime;
    private long endTime;

    public GoogleFitReadRequestData(DataType dataType, long startTime, long endTime) {
        this.dataType = dataType;
        this.startTime = startTime;
        this.endTime = endTime;
    } 
}

Затем я создаю запросы в цикле для этих диапазонов данных. Это упрощенный пример того, что делает мое приложение.

public void stackOverflowRequestExample() {
    initContext();
    HistoricalClientHelper clientHelper = new HistoricalClientHelper();
    List<GoogleFitReadRequestData> readRequestData = new ArrayList<>();
    readRequestData.addAll(clientHelper.GetTimeBuckets(DataType.TYPE_HEART_RATE_BPM));

    for (GoogleFitReadRequestData requestData : readRequestData) {
        DataReadRequest.Builder readRequestBuilder = new DataReadRequest.Builder();
        readRequestBuilder.read(requestData.getDataType());
        readRequestBuilder.enableServerQueries();
        readRequestBuilder.setTimeRange(requestData.getStartTime(), requestData.getEndTime(), TimeUnit.MILLISECONDS);

        GoogleSignInAccount googleSignInAccount =
                GoogleSignIn.getAccountForExtension(this.appContext, getFitnessOptions(requestData.getDataType()));

        Fitness.getHistoryClient(this.appContext, googleSignInAccount)
                .readData(readRequestBuilder.build())
                .addOnSuccessListener(response -> {
                    clientHelper.ProcessDataSetList(response.getDataSets());
                })
                .addOnCanceledListener(() -> Log.w("Google Fit: ", "Reading request from Google Fit was cancelled"))
                .addOnFailureListener(e -> Log.w("Google Fit: ", "There was an error reading data from Google Fit", e));
    }
}

public static GoogleSignInOptionsExtension getFitnessOptions(DataType type) {
    FitnessOptions.Builder optionsBuilder = FitnessOptions.builder();
    optionsBuilder.addDataType(type, FitnessOptions.ACCESS_READ);
    return optionsBuilder.build();
}

Проблема в том, что некоторые из них возвращают ответ (успех), а другие не возвращают никакого ответа. Даже не отменили и не провалили. Кто-нибудь знает, что я делаю неправильно?

PS: Я заметил эту проблему только с типом данных TYPE_HEART_RATE_BPM. Другие, например TYPE_STEP_COUNT_DELTA, работают нормально.

Источник

Ответы (1)

avatar
Alex Fedorenko
12 октября 2021 в 02:53
0

Хорошо. Оказывается, проблема заключалась в том, как были настроены разрешения на чтение в Google Cloud Console. На экране согласия OAuth области нужно было вручную найти в документации Google Fitbit и добавить в виде полных ссылок, и только после этого они появились в разделе конфиденциальных областей.