Flutter权限异常求助:多位置权限仅Permission.locationAlways生效
解决permission_handler多位置权限仅locationAlways生效的问题
核心排查点(新建项目正常,问题肯定出在现有项目配置/逻辑里)
1. 检查AndroidManifest权限是否漏写
确保现有项目的AndroidManifest.xml中三个位置权限都已声明,少一个都不行:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
其中ACCESS_BACKGROUND_LOCATION对应Permission.locationAlways,另外两个分别对应Permission.location和Permission.locationWhenInUse,漏写会直接导致对应权限无法触发申请弹窗。
2. 权限申请顺序错了!
Android系统有强制要求:申请后台位置权限(locationAlways)前,必须先拿到前台位置权限(locationWhenInUse或location)的授权。如果直接同时申请三个权限,系统会跳过前台权限的申请流程,只弹出后台权限的弹窗,看起来就像只有locationAlways生效。
错误写法:
await [Permission.location, Permission.locationWhenInUse, Permission.locationAlways].request();
正确步骤:
// 先申请前台权限,比如locationWhenInUse var frontStatus = await Permission.locationWhenInUse.request(); if (frontStatus.isGranted) { // 拿到前台权限后,再申请后台的locationAlways await Permission.locationAlways.request(); }
3. 清理缓存或排查配置冲突
- 先执行
flutter clean清除项目构建缓存,很多奇怪问题都是缓存导致的,清理后重新运行项目 - 检查现有项目是否有其他权限管理插件、原生权限代码和permission_handler冲突
- 对比新建项目的
android/build.gradle,确保compileSdkVersion、targetSdkVersion和新建项目一致,permission_handler 10.4.3要求targetSdkVersion至少为33
4. iOS项目需检查Info.plist配置
如果是iOS项目,Info.plist里必须添加对应的权限描述,否则系统会直接拒绝权限申请:
<key>NSLocationWhenInUseUsageDescription</key> <string>需要获取位置权限扫描WiFi</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>需要后台位置权限持续扫描WiFi</string> <key>NSLocationUsageDescription</key> <string>需要获取位置权限扫描WiFi</string>
总结
新建项目能正常申请所有权限,说明插件本身没问题,重点排查现有项目的权限配置、申请顺序和缓存问题,按上述步骤逐一验证即可解决。
内容的提问来源于stack exchange,提问作者李大龙
相关产品推荐
相关产品推荐

