在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及以下用存储权限:
Android 13及以上可以用细分媒体权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><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,能简化权限检查和申请的逻辑,无需自己封装原生代码。
三、权限申请的代码实现
通用流程
- 检查目标权限的当前状态
- 未授权则发起申请
- 根据申请结果执行对应操作
相机权限示例
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
相关产品推荐
相关产品推荐

