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

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é

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:04:39