Web应用调用Google Fit Rest API获取用户最新身高遇数据源返回问题
我来帮你解决这个问题!你当前的代码只返回数据源详情,核心原因是调用了错误的API方法——fitness.users.dataSources.get()是用来获取数据源的元数据(比如数据源类型、所属应用),而不是实际的身高测量数据。下面是具体的修正方案:
问题根源
fitness.users.dataSources.get()的作用是查询数据源本身的信息,而非该数据源下存储的用户测量数据。要拿到身高数值,你需要调用专门读取数据集的API方法。
解决步骤与修正代码
1. 使用正确的API方法
改用fitness.users.dataSources.datasets.get(),这个方法用于读取指定数据源下的具体测量数据。
2. 填写正确的身高数据源ID
Google Fit提供了预定义的合并身高数据源,会聚合所有来源的身高数据(手动输入、设备同步等),其ID为:derived:com.google.height:com.google.android.gms:merge_height
3. 生成有效的数据集ID
数据集ID的格式为[起始时间戳]-[结束时间戳](毫秒级)。如果想获取所有历史数据并取最新值,可以设起始时间为0,结束时间为当前时间Date.now()。
4. 提取最新身高数据
返回结果中的point数组包含所有身高测量点,每个点的value[0].fpVal就是身高的浮点值(单位为米),按时间戳倒序排序后取第一条即可。
完整修正代码
const scopes = [ 'https://www.googleapis.com/auth/plus.me', 'https://www.googleapis.com/auth/fitness.body.read' ]; const fitness = google.fitness('v1'); async function getLatestHeight() { try { // 合并身高数据源ID const heightDataSourceId = 'derived:com.google.height:com.google.android.gms:merge_height'; // 数据集ID:从最早时间到当前时间 const datasetId = `0-${Date.now()}`; const response = await fitness.users.dataSources.datasets.get({ userId: 'me', dataSourceId: heightDataSourceId, datasetId: datasetId, }); const heightPoints = response.data.point; if (!heightPoints || heightPoints.length === 0) { console.log('未找到任何身高数据'); return; } // 按时间戳倒序排序,取最新的一条 heightPoints.sort((a, b) => parseInt(b.endTimeNanos) - parseInt(a.endTimeNanos)); const latestHeightMeters = heightPoints[0].value[0].fpVal; const latestHeightCm = latestHeightMeters * 100; // 转换为厘米(可选) console.log(`最新身高:${latestHeightMeters} 米 / ${latestHeightCm.toFixed(1)} 厘米`); } catch (err) { console.error('获取身高数据失败:', err.message); } } // 调用函数 getLatestHeight();
额外提示
- 确保你的OAuth 2.0授权已经正确包含
fitness.body.read权限,这是读取身体数据的必要条件 - 如果用户从未添加过身高数据,
point数组会为空,记得做空值判断 - 身高数据默认单位是米,可根据需求转换为厘米或其他单位
内容的提问来源于stack exchange,提问作者Welsh
相关产品推荐
相关产品推荐

