从Google Fit API获取移动端添加的活动位置数据问题
嘿,我来帮你梳理下获取Google Fit位置数据的关键问题和调整方案:
首先,我注意到你请求里用了com.google.location.sample这个数据类型——这其实是Google Fit的测试示例类型,并不是存储用户实际位置数据的正式字段。这大概率是你拿不到预期数据的核心原因之一。
接下来咱们一步步调整你的请求:
1. 替换为正式的位置数据类型
把com.google.location.sample换成com.google.location,这是Google Fit存储用户GPS/位置数据的标准数据类型。如果需要更连续的轨迹记录,也可以尝试com.google.location.track(适合运动轨迹类的连续位置点)。
2. 修正请求体的格式与参数
你的请求体存在两个小问题:一是JSON键名未加双引号(会导致解析错误),二是bucketBySession的minDurationMillis设为1毫秒,会返回大量细碎的会话拆分。建议调整为合理的最小值(比如60000毫秒=1分钟),避免不必要的数据冗余。
修正后的完整请求体如下:
{ "aggregateBy": [ { "dataTypeName": "com.google.location" }, { "dataTypeName": "com.google.distance.delta" } ], "bucketBySession": { "minDurationMillis": 60000 }, "startTimeMillis": 1522281600000, "endTimeMillis": 1522368000000 }
3. 确认权限与数据源配置
- 务必在OAuth2 Playground中申请
https://www.googleapis.com/auth/fitness.location.read权限,没有这个权限是无法读取位置数据的; - 移动端添加的活动,位置数据可能关联到特定数据源(比如Google Fit官方app或第三方运动应用)。如果需要指定聚合后的数据源,可以在
aggregateBy中补充dataSourceId,示例如下:
{ "aggregateBy": [ { "dataTypeName": "com.google.location", "dataSourceId": "derived:com.google.location:com.google.android.gms:merge_location" } ] }
这个derived:开头的数据源是Google Fit自动整合后的位置数据源,适合获取统一的轨迹数据。
4. 解读响应数据格式
成功请求后,位置数据会包含在每个bucket的dataset中,数据点的经纬度以latitudeE7和longitudeE7字段存储(是乘以10^7的整数,需要除以10000000得到实际经纬度),示例响应片段:
{
"point": [
{
"startTimeNanos": "1522281600000000000",
"endTimeNanos": "1522285200000000000",
"dataTypeName": "com.google.location",
"value": [
{ "intVal": 374229000 }, // 对应纬度37.4229
{ "intVal": -1220850000 } // 对应经度-122.085
]
}
]
}
如果调整后仍无数据,可能是你指定的时间范围内没有带位置数据的移动端活动(比如手动添加的活动未填写位置信息)。
内容的提问来源于stack exchange,提问作者Harikrishnan Narayanan




