.NET中如何获取Android应用权限列表并启动时请求授权
获取AndroidManifest中定义的权限并请求授权(Xamarin Android)
1. 读取Manifest中声明的权限列表
你可以通过PackageManager获取当前应用的PackageInfo,其中的RequestedPermissions属性会返回所有在AndroidManifest.xml里声明的权限数组:
using Android.Content.PM; // 在MainActivity的OnCreate方法内执行 var packageInfo = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.Permissions); string[] manifestPermissions = packageInfo.RequestedPermissions;
2. 筛选需要动态申请的权限
不是所有Manifest权限都需要用户授权——只有危险权限(如CAMERA、READ_EXTERNAL_STORAGE等)需要手动请求,像INTERNET这类普通权限会被系统自动授予。我们需要过滤出当前未授予的危险权限:
List<string> permissionsToRequest = new List<string>(); if (manifestPermissions != null) { foreach (var perm in manifestPermissions) { if (CheckSelfPermission(perm) != Permission.Granted) { permissionsToRequest.Add(perm); } } }
3. 发起权限请求并处理结果
如果存在待申请的权限,调用RequestPermissions发起请求,同时重写OnRequestPermissionsResult处理授权结果:
完整MainActivity示例代码
using Android.App; using Android.Content.PM; using Android.OS; using Android.Widget; namespace YourAppNamespace { [Activity(Label = "@string/app_name", MainLauncher = true)] public class MainActivity : Activity { private const int PermissionRequestCode = 100; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.activity_main); // 获取Manifest中声明的所有权限 var packageInfo = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.Permissions); string[] manifestPermissions = packageInfo.RequestedPermissions; if (manifestPermissions == null) return; // 筛选未授予的权限 List<string> permissionsToRequest = new List<string>(); foreach (var perm in manifestPermissions) { if (CheckSelfPermission(perm) != Permission.Granted) { permissionsToRequest.Add(perm); } } // 发起授权请求 if (permissionsToRequest.Count > 0) { RequestPermissions(permissionsToRequest.ToArray(), PermissionRequestCode); } } // 处理权限授权结果 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PermissionRequestCode) { for (int i = 0; i < permissions.Length; i++) { if (grantResults[i] == Permission.Granted) { Toast.MakeText(this, $"{permissions[i]} 已授予", ToastLength.Short).Show(); // 此处可添加权限授予后的业务逻辑 } else { Toast.MakeText(this, $"{permissions[i]} 被拒绝,部分功能将受限", ToastLength.Short).Show(); // 处理权限被拒绝后的降级逻辑 } } } } } }
关键注意事项
- 普通权限(如
INTERNET、ACCESS_NETWORK_STATE)无需动态申请,CheckSelfPermission会直接返回Granted,不会被加入请求列表。 - 虽然代码支持启动时批量申请权限,但从用户体验角度,建议在具体功能触发时再申请对应权限,避免一次性弹出多个授权请求引起用户反感。
- 确保所有需要的权限都已在
AndroidManifest.xml中声明,否则RequestedPermissions不会返回未声明的权限。
内容的提问来源于stack exchange,提问作者user20138168
相关产品推荐
相关产品推荐

