【问题标题】:Google Fit History API returns wrong time bucketsGoogle Fit History API 返回错误的时间段
【发布时间】:2016-05-30 17:40:11
【问题描述】:

该请求应向 Google Fit 查询过去 3 个月的汇总心率数据,按 1 天时间段分组。然而,我得到的是三个数据点,包括一天(5 月 29 日)的两个数据点。预期结果总共是两个数据点:一个是 5 月 25 日,一个是 5 月 29 日。这是什么原因,我该如何解决这个问题?

这是代码:

DateTime now = new DateTime();
DateTime start = now.minusMonths(3);

DataReadRequest readRequest = new DataReadRequest.Builder()
    .aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
    .bucketByTime(1, TimeUnit.DAYS)
    .enableServerQueries()
    .setTimeRange(start.getMillis(), now.getMillis(), TimeUnit.MILLISECONDS)
    .build();

Fitness.HistoryApi.readData(googleApiClient, readRequest)
    .setResultCallback(new ResultCallback<DataReadResult>() {
      @Override public void onResult(@NonNull DataReadResult dataReadResult) {
        ArrayList<DataPoint> dataPoints = new ArrayList<>();
        for (Bucket bucket : dataReadResult.getBuckets()) {
          List<DataSet> dataSets = bucket.getDataSets();
          for (DataSet dataSet : dataSets) {
            Timber.d("dataSet.dataType: %s", dataSet.getDataType().getName());

            for (DataPoint dp : dataSet.getDataPoints()) {
              dataPoints.add(dp);
              Timber.d("Data point:");
              Timber.d("Type: %s", dp.getDataType().getName());
              Timber.d("Time: %s",
                  new DateTime(dp.getTimestamp(TimeUnit.MILLISECONDS)).toString());
              for (Field field : dp.getDataType().getFields()) {
                Timber.d("Field: %s. Value: %s", field.getName(), dp.getValue(field));
              }
            }
          }
        }
        //...
      }
    });

这是输出:

05-30 19:34:05.516 13518-13518/com.test D/TestFragment$1$override: Data point:
05-30 19:34:05.516 13518-13518/com.test D/TestFragment$1$override: Type: com.google.heart_rate.summary
05-30 19:34:05.516 13518-13518/com.test D/TestFragment$1$override: Time: 2016-05-25T22:22:58.526+02:00
05-30 19:34:05.517 13518-13518/com.test D/TestFragment$1$override: Field: average. Value: 65.0
05-30 19:34:05.517 13518-13518/com.test D/TestFragment$1$override: Field: max. Value: 65.0
05-30 19:34:05.517 13518-13518/com.test D/TestFragment$1$override: Field: min. Value: 65.0
05-30 19:34:05.517 13518-13518/com.test D/TestFragment$1$override: Data point:
05-30 19:34:05.518 13518-13518/com.test D/TestFragment$1$override: Type: com.google.heart_rate.summary
05-30 19:34:05.518 13518-13518/com.test D/TestFragment$1$override: Time: 2016-05-29T20:33:37.170+02:00
05-30 19:34:05.519 13518-13518/com.test D/TestFragment$1$override: Field: average. Value: 90.80258
05-30 19:34:05.519 13518-13518/com.test D/TestFragment$1$override: Field: max. Value: 164.0
05-30 19:34:05.519 13518-13518/com.test D/TestFragment$1$override: Field: min. Value: 55.0
05-30 19:34:05.519 13518-13518/com.test D/TestFragment$1$override: Data point:
05-30 19:34:05.520 13518-13518/com.test D/TestFragment$1$override: Type: com.google.heart_rate.summary
05-30 19:34:05.520 13518-13518/com.test D/TestFragment$1$override: Time: 2016-05-29T20:48:37.321+02:00
05-30 19:34:05.520 13518-13518/com.test D/TestFragment$1$override: Field: average. Value: 86.78551
05-30 19:34:05.521 13518-13518/com.test D/TestFragment$1$override: Field: max. Value: 106.0
05-30 19:34:05.521 13518-13518/com.test D/TestFragment$1$override: Field: min. Value: 78.0

【问题讨论】:

    标签: android google-play-services google-fit google-fit-sdk


    【解决方案1】:

    据我所知,指定数据源很重要。

    我已阅读常见问题解答-Values for step/distance/active time/calories do not match those of Fit app,数据差异可能是由于未读取正确的数据源造成的。如给定的那样,要匹配 Google Fit 的值,您应该读取如下数据:

    DataSource ESTIMATED_STEP_DELTAS = new DataSource.Builder()
           .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
           .setType(DataSource.TYPE_DERIVED)
           .setStreamName("estimated_steps")
           .setAppPackageName("com.google.android.gms")
           .build();
    DataReadRequest readRequest = new DataReadRequest.Builder()
           .aggregate(ESTIMATED_STEP_DELTAS,    DataType.AGGREGATE_STEP_COUNT_DELTA)
           .aggregate(DataType.TYPE_DISTANCE_DELTA, DataType.AGGREGATE_DISTANCE_DELTA)
           .aggregate(DataType.TYPE_CALORIES_EXPENDED, DataType.AGGREGATE_CALORIES_EXPENDED)
           .aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
           .bucketByTime(1, TimeUnit.DAYS)
           .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
           .build();
    

    我希望这会有所帮助。

    【讨论】:

    • 谢谢,但事实并非如此。数据源在这里并不重要,因为我想获取所有心率测量值。您发布的链接描述了一个不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多