MAUI Android应用已配置ACCESS_FINE_LOCATION但未触发精确定位权限请求且请求LocationAlways时抛出异常
MAUI Android应用已配置ACCESS_FINE_LOCATION但未触发精确定位权限请求且请求LocationAlways时抛出异常
嘿,我之前也踩过类似的权限坑,这问题确实挺磨人的!咱们一步步拆解排查,应该能解决:
1. 先检查AndroidManifest.xml的权限声明是否完整
Android 10(API 29)之后位置权限规则改了不少,光加ACCESS_FINE_LOCATION还不够,得把相关权限补全:
<!-- 精确定位+近似定位的基础权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 10+ 后台位置权限,API 33+ 无需设置maxSdkVersion --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <!-- Android 13+ 要求后台位置权限必须配合通知权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
之前你只加了ACCESS_FINE_LOCATION,缺少ACCESS_COARSE_LOCATION的话,系统只会弹出近似位置的请求选项,不会出现精确定位的选择项。
2. 严格遵循权限请求的顺序
MAUI里请求LocationAlways有个硬性前提:必须先拿到LocationWhenInUse的前台权限,直接请求后台权限肯定会抛异常。正确的请求流程应该是这样的:
// 第一步:先请求前台位置权限(此时会弹出精确/近似位置的选择弹窗) var foregroundStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); if (foregroundStatus == PermissionStatus.Granted) { // 第二步:再请求后台位置权限 var backgroundStatus = await Permissions.RequestAsync<Permissions.LocationAlways>(); if (backgroundStatus == PermissionStatus.Granted) { // 权限都搞定了,开始处理你的位置逻辑吧 } }
3. 注意不同Android版本的差异
- Android 12(API 31)及以上:请求前台位置时,系统会直接让用户选择“精确”或“近似”位置,前提是你同时声明了
ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION。 - Android 13(API 33)及以上:请求后台位置权限前,必须先获得
POST_NOTIFICATIONS权限,否则请求会直接失败。
4. 确认MAUI版本是否存在bug
如果上面的步骤都试过还是不行,建议把MAUI升级到最新的稳定版本——旧版本偶尔会有权限映射的小bug,升级后大概率能解决问题。
按照这个思路调整后,应该就能正常触发精确定位的权限请求,也不会再出现LocationAlways的权限异常了!
备注:内容来源于stack exchange,提问作者Kristof Bergé
相关产品推荐
相关产品推荐

