2016-05-30 2 views
0

Запрос должен запрашивать Google Fit для агрегированных данных о частоте сердечных сокращений в течение последних 3 месяцев, сгруппированных по 1-дневным ведрам. Однако я получаю три точки данных, в том числе два в течение одного дня (29 мая). Ожидаемый результат - это всего два данных: один для 25 мая и один для 29 мая. В чем причина этого и как я могу решить проблему?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

Насколько я знаю, это очень важно, чтобы указать источник данных.

Я читал в FAQ - 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