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
相关产品推荐
相关产品推荐

