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 工作得很好。

4

1 回答 1

0

好的。原来问题在于如何在 Google Cloud Console 中设置读取权限。在 OAuth 同意屏幕中,必须在 Google Fitbit 文档中手动找到范围并将其添加为完整链接,然后它们才会出现在敏感范围部分中。

于 2021-10-12T02:53:25.333 回答