React Native接入Google Fit已配置XML权限仍提示申请Activity Recognition权限
解决方法
- 补充动态申请Activity Recognition运行时权限
Android 10(API 29)及以上系统中,android.permission.ACTIVITY_RECOGNITION属于高危运行时权限,仅在AndroidManifest.xml中声明无效,必须在调用Google Fit相关能力前主动向用户申请授权。
你可以使用react-native-permissions库完成权限申请,你已配置的两个ACTIVITY_RECOGNITION权限保留即可,分别适配Android 9及以下和Android 10及以上版本,调整后的逻辑示例:
import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions'; // 权限检查逻辑 const checkActivityPermission = async () => { const result = await check(PERMISSIONS.ANDROID.ACTIVITY_RECOGNITION); if (result === RESULTS.GRANTED) return true; const requestResult = await request(PERMISSIONS.ANDROID.ACTIVITY_RECOGNITION); return requestResult === RESULTS.GRANTED; } // 调整原有useEffect逻辑 useEffect(() => { const initGoogleFit = async () => { const hasPermission = await checkActivityPermission(); if (!hasPermission) { alert('需要运动健身权限才能记录步数'); return; } const options = { scopes: [ Scopes.FITNESS_ACTIVITY_READ, Scopes.FITNESS_ACTIVITY_WRITE, Scopes.FITNESS_BODY_READ, Scopes.FITNESS_BODY_WRITE, ], }; GoogleFit.authorize(options) .then(authResult => { if (authResult.success) { // 调用startRecording时指定要记录的数据类型 GoogleFit.startRecording(() => {}, GoogleFit.DATA_TYPES.STEP_COUNT); } else { alert('AUTH_DENIED', authResult.message); } }) .catch(() => { alert('AUTH_ERROR'); }); } initGoogleFit(); }, []);
修正startRecording调用参数
react-native-google-fit的startRecording方法需要传入第二个参数指定要记录的数据类型,你之前仅传了回调函数未指定数据类型,可能会触发默认的全类型记录逻辑,额外请求不需要的权限。如果只需要步数追踪,指定GoogleFit.DATA_TYPES.STEP_COUNT即可。适配版本兼容
如果上述操作后仍有问题,可以尝试调整依赖版本:
- 升级
play-services-fitness到21.0.0及以上版本,和其他play服务依赖版本保持一致,避免版本冲突 - 升级
react-native-google-fit到0.18.0及以上稳定版,该版本开始已适配Android 10+的权限逻辑
- 排查真机环境
部分国产Android 10机型会对Google服务权限做额外限制,可手动到系统设置-应用管理-你的应用-权限管理中,查看「身体活动」权限是否已开启,同时确保设备已安装并登录Google Fit app,且Google服务框架运行正常。
内容的提问来源于stack exchange,提问作者dash
相关产品推荐
相关产品推荐

