Xamarin Forms请求权限时PermissionStatus因保护级别无法访问如何解决?
问题原因
你遇到的报错不是缺少NuGet包导致的,核心问题是命名空间冲突:
你已经通过using Xamarin.Essentials;引用了权限相关的正确命名空间,但是额外引入的using Java.Security;和系统自带的System.Security.Permissions命名空间下存在同名类型,IDE优先识别到了其他命名空间下非公开的PermissionStatus类型,才会抛出保护级别不足的报错,给的替换为PermissionState的建议也是错误的,这个类型完全不适用于Xamarin.Essentials的权限API。
解决步骤
- 确认你项目的共享层、Android端、iOS端都安装了同版本的Xamarin.Essentials NuGet包,版本建议选择和你Xamarin.Forms版本匹配的稳定版,若已经安装可以更新到最新稳定版,避免旧版本API公开性问题。
- 删除代码中无用的
using Java.Security;引用,这段权限申请逻辑完全不需要调用Java.Security下的内容。 - 如果删除后仍有冲突,可以直接给
PermissionStatus加上完整命名空间前缀,强制指定使用Xamarin.Essentials下的类型,避免冲突。
修正后代码
using System.ComponentModel; using Xamarin.Forms; using System.Threading.Tasks; using Xamarin.Essentials; namespace MyNameSpace { [DesignTimeVisible(false)] public partial class MainPage : ContentPage { // 加完整命名空间前缀彻底避免冲突 public async Task<Xamarin.Essentials.PermissionStatus> CheckAndRequestLocationPermission() { var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>(); if (status == Xamarin.Essentials.PermissionStatus.Granted) return status; if (status == Xamarin.Essentials.PermissionStatus.Denied && DeviceInfo.Platform == DevicePlatform.iOS) { // 提示用户去设置页开启权限,iOS权限被拒绝后无法在应用内再次申请 return status; } if (Permissions.ShouldShowRationale<Permissions.LocationWhenInUse>()) { // 给用户解释需要定位权限的原因 } status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); return status; } } }
内容的提问来源于stack exchange,提问作者Thomas Carlton
相关产品推荐
相关产品推荐

