如何在Xamarin Forms中申请Android 13(API 33)的多媒体及通知权限
在Xamarin Forms中为Android 13(API 33)申请音乐和音频、通知、照片和视频权限
一、配置Android清单文件
在Android项目的AndroidManifest.xml中添加对应权限声明:
- 音乐和音频权限:
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
- 通知权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
- 照片和视频权限:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
注:若需兼容Android 12及以下版本,可保留旧版权限(如
READ_EXTERNAL_STORAGE),Android 13会自动优先使用新拆分的权限。
二、代码中申请权限
推荐通过DependencyService实现跨平台调用,或直接在Android项目中处理权限逻辑,以下提供两种实现方式:
方法1:使用Xamarin.Essentials(简化实现)
- 为Forms和Android项目安装NuGet包
Xamarin.Essentials。 - 在Forms项目中直接调用权限申请:
申请音乐和音频权限
var status = await Permissions.CheckStatusAsync<Permissions.MediaAudio>(); if (status != PermissionStatus.Granted) { status = await Permissions.RequestAsync<Permissions.MediaAudio>(); } if (status == PermissionStatus.Granted) { // 权限已授予,执行音频相关操作 }
申请通知权限
var status = await Permissions.CheckStatusAsync<Permissions.PostNotifications>(); if (status != PermissionStatus.Granted) { status = await Permissions.RequestAsync<Permissions.PostNotifications>(); } if (status == PermissionStatus.Granted) { // 权限已授予,发送通知 }
申请照片和视频权限
可合并申请两个权限:
var imageStatus = await Permissions.CheckStatusAsync<Permissions.MediaImages>(); var videoStatus = await Permissions.CheckStatusAsync<Permissions.MediaVideo>(); if (imageStatus != PermissionStatus.Granted || videoStatus != PermissionStatus.Granted) { await Permissions.RequestAsync<Permissions.MediaImages>(); await Permissions.RequestAsync<Permissions.MediaVideo>(); } if (imageStatus == PermissionStatus.Granted && videoStatus == PermissionStatus.Granted) { // 权限已授予,访问照片/视频 }
方法2:原生Android权限申请(自定义实现)
- 在Forms项目定义权限服务接口:
public interface IPermissionService { Task<bool> RequestMediaAudioPermission(); Task<bool> RequestNotificationsPermission(); Task<bool> RequestMediaImagesAndVideosPermission(); }
- 在Android项目实现该接口:
[assembly: Dependency(typeof(AndroidPermissionService))] namespace YourAppName.Droid.Services { public class AndroidPermissionService : IPermissionService { private const int RequestMediaAudioCode = 100; private const int RequestNotificationsCode = 101; private const int RequestMediaImagesVideosCode = 102; private TaskCompletionSource<bool> _permissionTcs; public async Task<bool> RequestMediaAudioPermission() { var context = Android.App.Application.Context; if (ContextCompat.CheckSelfPermission(context, Manifest.Permission.ReadMediaAudio) == Permission.Granted) { return true; } _permissionTcs = new TaskCompletionSource<bool>(); ((MainActivity)Forms.Context).RequestPermissions(new[] { Manifest.Permission.ReadMediaAudio }, RequestMediaAudioCode); return await _permissionTcs.Task; } public async Task<bool> RequestNotificationsPermission() { var context = Android.App.Application.Context; if (ContextCompat.CheckSelfPermission(context, Manifest.Permission.PostNotifications) == Permission.Granted) { return true; } _permissionTcs = new TaskCompletionSource<bool>(); ((MainActivity)Forms.Context).RequestPermissions(new[] { Manifest.Permission.PostNotifications }, RequestNotificationsCode); return await _permissionTcs.Task; } public async Task<bool> RequestMediaImagesAndVideosPermission() { var context = Android.App.Application.Context; var hasImagesPerm = ContextCompat.CheckSelfPermission(context, Manifest.Permission.ReadMediaImages) == Permission.Granted; var hasVideosPerm = ContextCompat.CheckSelfPermission(context, Manifest.Permission.ReadMediaVideo) == Permission.Granted; if (hasImagesPerm && hasVideosPerm) { return true; } _permissionTcs = new TaskCompletionSource<bool>(); ((MainActivity)Forms.Context).RequestPermissions(new[] { Manifest.Permission.ReadMediaImages, Manifest.Permission.ReadMediaVideo }, RequestMediaImagesVideosCode); return await _permissionTcs.Task; } // 供MainActivity回调时调用 public void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { bool isGranted = grantResults.All(r => r == Permission.Granted); _permissionTcs?.SetResult(isGranted); } } }
- 在MainActivity中重写权限回调:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); var permissionService = DependencyService.Get<IPermissionService>() as AndroidPermissionService; permissionService?.OnRequestPermissionsResult(requestCode, permissions, grantResults); }
- 在Forms项目中调用服务:
var permissionService = DependencyService.Get<IPermissionService>(); bool audioGranted = await permissionService.RequestMediaAudioPermission(); bool notificationsGranted = await permissionService.RequestNotificationsPermission(); bool mediaGranted = await permissionService.RequestMediaImagesAndVideosPermission();
三、注意事项
- 申请前先检查权限状态,避免重复申请。
- 用户拒绝权限后,可通过
AppInfo.ShowSettingsUI()(Xamarin.Essentials)引导用户到应用设置页面手动开启。 - Android 13中通知权限为可选权限,用户可随时在系统设置中关闭。
内容的提问来源于stack exchange,提问作者Manthiram
相关产品推荐
相关产品推荐

