GoogleFit Rest API - 正确的每日步数聚合数据源

Mr.*_*. V 7 api rest google-fit

API 文档表示,要获得像 Google Fit 应用程序一样的结果,应该请求derived:com.google.step_count.delta:com.google.android.gms:estimated_steps数据源 的步骤https://developers.google.com/fit/scenarios/read-daily-step-total https://developers .google.com/fit/faq#get-step-count

在实践中,它看起来大多是正确的,但有时结果却相差甚远。

在进行一些测试时,我注意到,有时使用derived:com.google.step_count.delta:com.google.android.gms:merge_step_deltas数据源可以获得更好的结果,或者至少获得与 Google Fit 应用程序中显示的值更相似的值。

但我认为,如果用户使用更多设备来计算步数,则该数据源会将所有步数合并起来,但这是错误的。

使用estimated_steps数据源是否正确,或者我应该切换到该数据merge_step_deltas源吗?或者我还可以做些什么来获得正确的步数?

真实例子

客户的步数与 Google Fit 应用显示的步数不匹配。

这是他的数据源列表

{
  "dataSource": [
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "duration", 
            "format": "integer"
          }
        ], 
        "name": "com.google.active_minutes"
      }, 
      "dataStreamName": "from_activity<-merge_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.active_minutes:com.google.android.gms:from_activity<-merge_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "duration", 
            "format": "integer"
          }
        ], 
        "name": "com.google.active_minutes"
      }, 
      "dataStreamName": "from_steps<-estimated_steps", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.active_minutes:com.google.android.gms:from_steps<-estimated_steps", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "duration", 
            "format": "integer"
          }
        ], 
        "name": "com.google.active_minutes"
      }, 
      "dataStreamName": "merge_active_minutes", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.active_minutes:com.google.android.gms:merge_active_minutes", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataStreamName": "merge_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:merge_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataStreamName": "platform_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:platform_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "activity_from_steps", 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:samsung:SM-A600FN:324bd687:activity_from_steps", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "from_activity_samples<-derived:com.google.activity.samples:com.google.android.gms:samsung:SM-A600FN:324bd687:detailed", 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:samsung:SM-A600FN:324bd687:from_activity_samples<-derived:com.google.activity.samples:com.google.android.gms:samsung:SM-A600FN:324bd687:detailed", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "calories", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.calories.expended"
      }, 
      "dataStreamName": "from_activities", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.calories.expended:com.google.android.gms:from_activities", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "calories", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.calories.expended"
      }, 
      "dataStreamName": "merge_calories_expended", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.calories.expended:com.google.android.gms:merge_calories_expended", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "calories", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.calories.expended"
      }, 
      "dataStreamName": "platform_calories_expended", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.calories.expended:com.google.android.gms:platform_calories_expended", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "from_activity<-merge_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:from_activity<-merge_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "from_heart_rate<-merge_heart_rate_bpm", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:from_heart_rate<-merge_heart_rate_bpm", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "from_steps<-estimated_steps", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:from_steps<-estimated_steps", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "merge_heart_minutes", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:merge_heart_minutes", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "soft_step_counter", 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.cumulative"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:324bd687:soft_step_counter", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataStreamName": "estimated_steps", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataStreamName": "merge_step_deltas", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:merge_step_deltas", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "derive_step_deltas<-derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:324bd687:soft_step_counter", 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:samsung:SM-A600FN:324bd687:derive_step_deltas<-derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:324bd687:soft_step_counter", 
      "type": "derived"
    }, 
    {
      "name": "Generic ANT+ Sensor", 
      "dataStreamName": "AntPlus.0.124", 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.dsi.ant.plugins.antplus"
      }, 
      "dataStreamId": "raw:com.google.step_count.delta:com.dsi.ant.plugins.antplus:AntPlus.0.124", 
      "type": "raw"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

5 月 2 日这一天,应用程序显示了大约 15000 步(与merge_step_deltas数据源匹配),而从数据源请求步数时,estimated_steps我得到了大约 7000 步。

derived:com.google.step_count.delta:com.google.android.gms:estimated_steps

{
  "bucket": [
    {
      "startTimeMillis": "1556748000000", 
      "endTimeMillis": "1556834400000", 
      "dataset": [
        {
          "dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:aggregated", 
          "point": [
            {
              "startTimeNanos": "1556748469517481594", 
              "originDataSourceId": "derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:4dc460aaeb28b288:soft_step_counter", 
              "endTimeNanos": "1556831065968126307", 
              "value": [
                {
                  "mapVal": [], 
                  "intVal": 7601
                }
              ], 
              "dataTypeName": "com.google.step_count.delta"
            }
          ]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

derived:com.google.step_count.delta:com.google.android.gms:merge_step_deltas

{
  "bucket": [
    {
      "startTimeMillis": "1556748000000", 
      "endTimeMillis": "1556834400000", 
      "dataset": [
        {
          "dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:aggregated", 
          "point": [
            {
              "startTimeNanos": "1556748469517481594", 
              "originDataSourceId": "derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:4dc460aaeb28b288:soft_step_counter", 
              "endTimeNanos": "1556831065968126307", 
              "value": [
                {
                  "mapVal": [], 
                  "intVal": 15368
                }
              ], 
              "dataTypeName": "com.google.step_count.delta"
            }
          ]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)