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

React Native+Expo38:Android10+始终允许位置权限弹窗不显示问题

解决Android 10+上Expo 38应用无法弹出始终允许位置权限弹窗的问题

我之前做React Native项目时也碰到过一模一样的坑!Android 10开始谷歌彻底调整了位置权限的管控逻辑,再加上Expo 38的权限处理有特定要求,才导致始终允许的弹窗压根不出来。下面给你一步步拆解解决方法:

1. 先把app.json的权限配置补全

Android 10+新增了ACCESS_BACKGROUND_LOCATION权限,必须在app.json里明确声明,还要加上权限用途说明(系统强制要求,否则不会触发弹窗):

{
  "expo": {
    "android": {
      "permissions": [
        "ACCESS_FINE_LOCATION",
        "ACCESS_BACKGROUND_LOCATION"
      ],
      "permission": {
        "ACCESS_BACKGROUND_LOCATION": "需要始终访问位置信息以提供[你的核心功能描述,比如实时导航/位置追踪]服务"
      }
    }
  }
}

旧版Android不需要这个配置,所以之前能正常运行,但新系统必须加。

2. 按正确顺序请求权限

Android 10+不允许直接跳步请求后台权限,必须先让用户授予前台位置权限(也就是「仅在使用应用时允许」),之后才能请求后台权限(「始终允许」)。在Expo 38里要分两次调用权限请求:

import * as Permissions from 'expo-permissions';

async function requestFullLocationAccess() {
  // 第一步:先请求前台位置权限
  const foregroundResult = await Permissions.askAsync(Permissions.LOCATION);
  if (foregroundResult.status !== 'granted') {
    // 这里可以给用户弹提示,引导开启权限
    return;
  }

  // 第二步:前台权限拿到后,再请求后台权限
  const backgroundResult = await Permissions.askAsync(Permissions.LOCATION_BACKGROUND);
  if (backgroundResult.status === 'granted') {
    console.log('终于拿到始终允许的位置权限啦!');
  }
}

注意:必须在应用处于前台状态时调用这段代码,后台状态下请求是无效的。

3. 测试前的关键操作

测试前一定要去系统设置里清除应用的现有权限(路径:设置→应用→你的应用→权限→位置→重置权限),否则之前的权限状态会干扰新的请求流程,弹窗还是可能不出来。

为啥旧版Android没问题?

因为Android 9及以下没有拆分前台/后台位置权限,只需要ACCESS_FINE_LOCATION就能获得始终访问的权限,所以旧逻辑在新系统上直接失效了。

内容的提问来源于stack exchange,提问作者Ronaldo De La Cruz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:42:51