2016-05-30 4 views
0

リクエストは、Google Fitに過去3か月の集計された心拍数データをクエリし、1日分のバケットでグループ化したものとみなされます。しかし、私が得るのは3つのデータポイントで、1日2回(5月29日)です。予想される結果は、5月25日と5月29日の合計2つのデータポイントです。これの理由は何ですか?問題をどのように解決できますか?Google Fit History APIが間違ったタイムバケットを返す

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 

答えて

0

、データ・ソースを指定することが重要です。

よくある質問 - 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(); 

私は役に立つと思います。

+0

ありがとうございますが、そうではありません。すべての心拍数を取得したいので、データソースはここでは重要ではありません。投稿したリンクは、別の問題を説明しています。 – EyesClear

関連する問題