Flutter应用上架Google Play后位置权限申请未触发问题求助
问题根因与解决方案
该问题是Flutter Android应用上架Google Play后的典型适配问题,核心原因大多和Google Play的App Bundle分发规则、权限声明适配、发布权限过滤逻辑相关,按以下步骤排查修复即可:
1. 校验Android端权限声明配置
- 确认
android/app/src/main/AndroidManifest.xml中已经完整声明位置权限,不要只把权限写在debug或profile目录下的Manifest文件,该目录下的配置不会打包到正式版:
<!-- 基础前台位置权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 若应用需要后台定位能力,额外添加以下权限,且必须在Google Play后台提交后台权限的使用场景说明 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
- 补充
uses-feature声明,避免Google Play针对无定位硬件的设备自动过滤权限:
<uses-feature android:name="android.hardware.location.network" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" /> <uses-feature android:name="android.hardware.location" android:required="false" />
2. 修复App Bundle(AAB)分发的权限裁剪问题
Google Play分发AAB包时会自动裁剪平台判定为非必要的权限,本地调试的APK不会触发该规则,需要在AndroidManifest.xml的manifest节点下添加权限保留声明,强制保留位置相关权限:
<!-- 给每个位置权限添加tools:node="replace"属性,禁止裁剪 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="replace" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="replace" /> <!-- 如果使用后台权限也添加对应属性 -->
注意需要在manifest根节点补充xmlns:tools="http://schemas.android.com/tools"声明,才能正常使用tools属性
3. 调整Flutter侧权限请求逻辑
- 不要在应用首帧渲染同步触发权限申请,要等页面渲染完成后再触发请求,避免Android12+系统自动拦截弹窗
- 升级权限请求依赖库到最新稳定版,比如
permission_handler需要升级到10.0+版本适配Android13+的权限规则 - 请求权限前先调用权限状态查询接口判断当前权限状态,不要硬编码直接触发请求,部分系统版本会因为重复请求直接拒绝弹窗触发
4. 打包验证
本地打Release版APK安装测试,不要只用Debug版验证功能,确认本地Release版权限弹窗正常后,再打AAB包上传到Google Play内部测试轨道验证,内部测试版本功能正常后再推送正式版。
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

