You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native 请求定位权限默认返回never_ask_again问题求助

问题原因
  • 代码中重复调用权限申请逻辑:你在第一次调用PermissionsAndroid.request弹出权限申请框后,未等待用户完成操作,就立刻在console.log中第二次调用了同一权限的申请方法。系统检测到同一权限的重复申请会直接拦截,默认返回never_ask_again,同时标记该权限不再弹出申请框。
  • 设备上已经触发过「拒绝且不再询问」操作:如果之前测试时已经拒绝过该权限并勾选了不再询问选项,后续所有权限申请都会直接返回never_ask_again,不会弹出申请框。
  • 权限申请说明与实际申请权限不匹配:你当前申请的是定位权限,但弹窗文案全部是相机权限相关说明,部分系统的权限合规检测会判定申请用途不符,拦截权限申请请求。
  • 高版本Android系统适配问题:如果你的APPtargetSdkVersion >= 31(对应Android 12及以上版本),申请精确定位时必须同时提供粗略定位选项,否则系统会直接驳回申请。
解决方案
  1. 移除重复的权限申请调用,保留单次申请逻辑即可,同时修正申请弹窗文案和实际权限匹配,参考代码如下:
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
  }
}
  1. 清理历史权限状态:卸载当前测试应用重新安装,或者手动进入系统设置-应用管理-当前应用-权限管理,重置定位权限状态后再测试申请逻辑。
  2. 高版本系统适配:如果targetSdkVersion >=31,确保AndroidManifest.xml中同时声明了ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION权限,系统会自动给用户提供精度选择入口,避免申请被直接驳回。

内容的提问来源于stack exchange,提问作者tomi podolsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:15:03