Xamarin.Forms如何申请ACCESS_BACKGROUND_LOCATION后台定位权限?
权限申请顺序规则说明
你了解到的「不能同时申请ACCESS_FINE_LOCATION和ACCESS_BACKGROUND_LOCATION,必须先获得前者授权后再申请后者」的说法完全属实,这是Android 11(API 30)及以上系统的官方强制要求:如果同时提交两个权限的申请请求,系统会直接忽略后台定位权限的申请,甚至直接抛出异常导致应用崩溃。
完整解决方案
1. 验证AndroidManifest.xml配置
旧版Xamarin项目属性的权限列表没有同步高版本Android的新增权限,你手动添加权限的操作是正确的,确认清单文件包含以下配置即可:
<!-- 前台定位权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 后台定位权限 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
2. 调整权限申请流程
Xamarin.Essentials 1.7.0的Permissions.LocationAlways本身就对应Android的后台定位权限,你之前直接申请失败的核心原因是没有先拿到前台定位权限,需要调整申请顺序:
// 第一步:先申请前台定位权限 var foregroundPermission = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); if (foregroundPermission != PermissionStatus.Granted) { // 前台权限被拒,告知用户权限必要性后终止后续流程 return; } // 第二步:拿到前台权限后再申请后台定位权限 var backgroundPermission = await Permissions.RequestAsync<Permissions.LocationAlways>(); if (backgroundPermission == PermissionStatus.Granted) { // 后台定位权限获取成功,可正常使用相关功能 }
3. 修复AppCenter崩溃问题
AppCenter Analytics默认不会强制要求后台定位权限,崩溃的核心原因是组件尝试采集位置信息时检测到清单声明了后台定位权限但未获得用户授权,你可以主动关闭AppCenter的位置采集功能从根源解决问题:
// 初始化AppCenter时加入配置 AppCenter.Start("你的AppCenter应用密钥", typeof(Analytics), typeof(Crashes)); // 禁用Analytics自动位置采集 Analytics.SetEnabledAsync(false);
内容的提问来源于stack exchange,提问作者dlchambers
相关产品推荐
相关产品推荐

