Xamarin.Forms运行时如何同时申请相机和位置两项权限
Xamarin.Forms 运行时同时申请位置、相机权限解决方案
可以实现运行时同时申请多项权限,以下是两种成熟的实现方案:
方案1:使用Xamarin.Essentials 1.6+ 内置批量申请API(推荐)
Xamarin.Essentials 1.6及以上版本原生支持一次性申请多个权限,无需额外自定义逻辑:
- 首先在共享项目和各平台项目中安装最新版
Xamarin.EssentialsNuGet包,完成平台初始化配置:- Android端:在
MainActivity.OnCreate中调用Xamarin.Essentials.Platform.Init(this, savedInstanceState),并重写OnRequestPermissionsResult方法将结果传递给Essentials:public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } - iOS端:在
AppDelegate.FinishedLaunching中调用Xamarin.Essentials.Platform.Init()
- Android端:在
- 权限申请示例代码:
public async Task CheckAndRequestPermissions() { var permissionStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse, Permissions.Camera>(); if (permissionStatus == PermissionStatus.Granted) { // 两项权限均已授予,执行业务逻辑 } else { // 存在权限被拒绝,引导用户到设置页手动开启 } } - 前置配置要求:
- Android:在
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> - iOS:在
Info.plist中添加权限使用描述:<key>NSLocationWhenInUseUsageDescription</key> <string>需要位置权限以提供定位服务</string> <key>NSCameraUsageDescription</key> <string>需要相机权限以完成扫码/拍照功能</string>
- Android:在
方案2:自定义依赖服务实现(适配低版本Xamarin.Essentials)
如果你使用的Essentials版本低于1.6,可以通过依赖服务自己实现批量申请:
- 共享项目定义
IPermissionService接口,声明Task<bool> RequestLocationAndCameraPermissions()方法 - Android端实现:调用
ActivityCompat.RequestPermissions,直接传入包含位置、相机权限的字符串数组,系统会按顺序弹出申请弹窗 - iOS端实现:按顺序申请两个权限,iOS的权限弹窗会自动排队展示,不会出现冲突
原有单权限申请失败原因排查
你之前每次只能成功申请一项权限,通常是以下原因导致:
- 权限申请为串行异步调用,前一个申请的异步任务未完成就触发第二个申请,导致平台层请求冲突
- 某一项权限未在对应平台的配置文件中声明,系统直接返回拒绝状态
内容的提问来源于stack exchange,提问作者Rohit Chauhan
相关产品推荐
相关产品推荐

