Android向Google Fit上传数据报错5002:DataType名称与包名不匹配
我之前帮几个开发者排查过完全相同的问题,这个错误确实是Google Fit在2019年9月左右调整了DataSource命名验证规则导致的——之前允许自定义任意名称,之后强制要求名称格式必须和应用包名绑定。
问题根源
Google Fit更新了后台校验逻辑,要求DataSource的name字段必须遵循固定格式:
[你的应用包名]:[数据类型的蛇形小写名称]:[可选的自定义标识]
比如TYPE_LOCATION_SAMPLE对应的蛇形名称是location_sample,所以正确的name应该是com.foo.bar:location_sample:session-tracker这种格式。之前的自定义名称(比如uniqueIdentifier + "-locations")会触发校验失败,抛出5002错误。
具体解决方案
修正DataSource的命名格式
把你的DataSource构建代码改成严格符合规则的格式,示例如下:DataSource locationDataSource = new DataSource.Builder() .setAppPackageName(packageName) .setDataType(DataType.TYPE_LOCATION_SAMPLE) // 核心:按照包名+数据类型名的格式设置name .setName(packageName + ":location_sample:" + uniqueIdentifier) .setType(DataSource.TYPE_RAW) .build();其他类型的DataSource(比如
TYPE_CALORIES_EXPENDED)也要对应调整,比如packageName + ":calories_expended:" + uniqueIdentifier。统一所有DataPoint的DataSource
检查你构建SessionInsertRequest时添加的所有DataPoint,确保它们都使用了上述修正后的DataSource,不能混用旧的自定义名称的数据源。重置应用权限缓存(可选但建议)
如果之前上传过不符合规则的测试数据,可能会在Google Fit后台留下残留数据,导致后续请求仍报错。可以让用户:- 打开Google Fit应用
- 进入设置 > 数据共享 > 关联的应用和设备
- 找到你的应用,移除权限后重新授权
再次确认权限请求的一致性
确保FitnessOptions中请求的DataType和你实际上传的DataType完全匹配,比如你请求了TYPE_LOCATION_SAMPLE和TYPE_CALORIES_EXPENDED的WRITE权限,就只能上传这两种类型的数据,不能额外添加未授权的DataType。
补充说明
这个规则是Google为了规范第三方应用的数据来源、避免数据混淆而新增的,属于后台规则变更,所以即使你没有修改代码,也会在2019年9月之后开始报错。按照上面的步骤调整后,应该就能正常上传Session了。
内容的提问来源于stack exchange,提问作者le chiffre

