React Native 请求定位权限默认返回never_ask_again问题求助
问题原因
- 代码中重复调用权限申请逻辑:你在第一次调用
PermissionsAndroid.request弹出权限申请框后,未等待用户完成操作,就立刻在console.log中第二次调用了同一权限的申请方法。系统检测到同一权限的重复申请会直接拦截,默认返回never_ask_again,同时标记该权限不再弹出申请框。 - 设备上已经触发过「拒绝且不再询问」操作:如果之前测试时已经拒绝过该权限并勾选了不再询问选项,后续所有权限申请都会直接返回
never_ask_again,不会弹出申请框。 - 权限申请说明与实际申请权限不匹配:你当前申请的是定位权限,但弹窗文案全部是相机权限相关说明,部分系统的权限合规检测会判定申请用途不符,拦截权限申请请求。
- 高版本Android系统适配问题:如果你的APP
targetSdkVersion >= 31(对应Android 12及以上版本),申请精确定位时必须同时提供粗略定位选项,否则系统会直接驳回申请。
解决方案
- 移除重复的权限申请调用,保留单次申请逻辑即可,同时修正申请弹窗文案和实际权限匹配,参考代码如下:
requestLocationPermission = async () => { try { // 先检查是否已经获得权限 const hasPermission = await PermissionsAndroid.check( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION ) if (hasPermission) { console.log('已获得定位权限') return true } // 未获得权限时发起申请 const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION, { title: "定位权限申请", message: "应用需要获取您的位置信息,为您提供精准的周边服务", buttonNeutral: "稍后询问", buttonNegative: "取消", buttonPositive: "允许" } ) if (granted === PermissionsAndroid.RESULTS.GRANTED) { console.log('定位权限申请成功') return true } else if (granted === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN) { console.log('用户已禁止定位权限且不再询问,可引导用户到系统设置页手动开启') return false } else { console.log('用户拒绝了定位权限') return false } } catch (err) { console.warn('权限申请出错', err) return false } }
- 清理历史权限状态:卸载当前测试应用重新安装,或者手动进入系统设置-应用管理-当前应用-权限管理,重置定位权限状态后再测试申请逻辑。
- 高版本系统适配:如果targetSdkVersion >=31,确保
AndroidManifest.xml中同时声明了ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION权限,系统会自动给用户提供精度选择入口,避免申请被直接驳回。
内容的提问来源于stack exchange,提问作者tomi podolsky
相关产品推荐
相关产品推荐

