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

在MonoGame中申请Android权限的方法(兼容net6.0-android)

在.NET 6 Android/MonoGame中申请权限的实现方案

不管是MonoGame项目还是普通的.NET 6 Android项目,权限申请的核心逻辑都是基于Android原生权限体系结合.NET官方提供的权限库来实现的,以下是具体步骤:

一、先在AndroidManifest.xml中声明权限

所有需要的权限必须先在项目的Properties/AndroidManifest.xml中声明,否则申请会直接失败:

  • 相机权限:
    <uses-permission android:name="android.permission.CAMERA" />
    
  • 文件读取权限(根据Android版本适配):
    Android 10及以下用存储权限:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
    Android 13及以上可以用细分媒体权限:
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    
  • 通知权限(Android 13+需要):
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    

二、引入兼容的权限处理库

直接使用微软官方的Microsoft.Maui.ApplicationModel.Permissions NuGet包,它完全兼容net6.0-android,能简化权限检查和申请的逻辑,无需自己封装原生代码。

三、权限申请的代码实现

通用流程

  1. 检查目标权限的当前状态
  2. 未授权则发起申请
  3. 根据申请结果执行对应操作

相机权限示例

using Microsoft.Maui.ApplicationModel;

// MonoGame中需确保代码在UI线程执行,可通过Game.Activity.RunOnUiThread包裹
await Game.Activity.RunOnUiThread(async () =>
{
    var status = await Permissions.CheckStatusAsync<Permissions.Camera>();

    if (status != PermissionStatus.Granted)
    {
        status = await Permissions.RequestAsync<Permissions.Camera>();
    }

    if (status == PermissionStatus.Granted)
    {
        // 这里可以调用相机相关功能
    }
    else
    {
        // 权限被拒绝,提示用户开启
    }
});

文件权限示例

针对不同Android版本适配:

await Game.Activity.RunOnUiThread(async () =>
{
    PermissionStatus status;
    if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Tiramisu)
    {
        // Android 13+ 读取图片
        status = await Permissions.CheckStatusAsync<Permissions.Media.Images>();
        if (status != PermissionStatus.Granted)
        {
            status = await Permissions.RequestAsync<Permissions.Media.Images>();
        }
    }
    else
    {
        // Android 10及以下 读取存储
        status = await Permissions.CheckStatusAsync<Permissions.StorageRead>();
        if (status != PermissionStatus.Granted)
        {
            status = await Permissions.RequestAsync<Permissions.StorageRead>();
        }
    }

    if (status == PermissionStatus.Granted)
    {
        // 执行文件读取操作
    }
});

通知权限示例

await Game.Activity.RunOnUiThread(async () =>
{
    var status = await Permissions.CheckStatusAsync<Permissions.Notifications>();

    if (status != PermissionStatus.Granted)
    {
        status = await Permissions.RequestAsync<Permissions.Notifications>();
    }

    if (status == PermissionStatus.Granted)
    {
        // 发送通知
    }
});

处理永久拒绝的情况

如果用户勾选了"不再询问"并拒绝权限,后续申请会直接返回PermissionStatus.Denied,此时需要引导用户到应用设置页面开启:

if (status == PermissionStatus.Denied && !Permissions.ShouldShowRationale<Permissions.Camera>())
{
    // 提示用户需要到设置开启权限
    AppInfo.ShowSettingsUI();
}

内容的提问来源于stack exchange,提问作者user18513298

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:50:33