You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:35:18