Xamarin开发Android应用如何一次性申请Manifest中所有已声明权限
实现方案
你需要先读取AndroidManifest中声明的所有权限,过滤出未授权的列表后再统一调用申请接口,完整修改逻辑如下:
1. 定义权限申请请求码
提前声明唯一请求码用于标识本次权限申请:
private const int RequestAllPermissionsCode = 100;
2. 替换原有权限检查逻辑
把你只检查相机权限的代码替换为以下逻辑,实现自动读取所有声明权限并申请:
// 读取Manifest中声明的全部权限 var declaredPermissions = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.Permissions)?.RequestedPermissions; if (declaredPermissions == null || declaredPermissions.Length == 0) { // 未声明任何权限,直接执行后续业务 return; } // 过滤出尚未授予的权限 var notGrantedPermissions = new List<string>(); foreach (var permission in declaredPermissions) { if (ContextCompat.CheckSelfPermission(this, permission) != (int)Permission.Granted) { notGrantedPermissions.Add(permission); } } if (notGrantedPermissions.Count == 0) { // 所有权限已授予,直接执行后续业务 return; } // 一次性申请所有未授权权限 ActivityCompat.RequestPermissions(this, notGrantedPermissions.ToArray(), RequestAllPermissionsCode);
3. 处理权限申请结果回调
重写Activity的OnRequestPermissionsResult方法,接收用户授权结果:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == RequestAllPermissionsCode) { bool allGranted = true; foreach (var result in grantResults) { if (result != Permission.Granted) { allGranted = false; break; } } if (allGranted) { // 所有权限申请通过,执行业务逻辑 } else { // 有权限被拒绝,可根据业务需要提示用户或关闭对应功能 } } }
注意:Android 6.0及以上系统仅需要动态申请危险权限,普通权限会在安装时自动授予,上述逻辑会自动跳过已授权权限,不会重复申请。
内容的提问来源于stack exchange,提问作者Sofiane Boukedjani
相关产品推荐
相关产品推荐

