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

如何在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(简化实现)

  1. 为Forms和Android项目安装NuGet包Xamarin.Essentials。
  2. 在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权限申请(自定义实现)

  1. 在Forms项目定义权限服务接口:
public interface IPermissionService
{
    Task<bool> RequestMediaAudioPermission();
    Task<bool> RequestNotificationsPermission();
    Task<bool> RequestMediaImagesAndVideosPermission();
}
  1. 在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);
        }
    }
}
  1. 在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);
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:45