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

Maui Android 14 API34存储写入与音频权限请求失败求助

解决方案:Android 14(API34)下MAUI音频读写权限被拒问题

1. 修正AndroidManifest.xml权限配置

你的Manifest存在无效权限,且未适配Android 14的媒体权限规则,调整后的配置如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:allowBackup="true" 
             android:icon="@mipmap/appicon" 
             android:supportsRtl="true" 
             android:debuggable="true">
    <uses-sdk android:minSdkVersion="21" 
          android:targetSdkVersion="34" /> 
    </application> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
    <!-- Android 13+ 音频读取权限 -->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <!-- Android 14+ 音频写入权限 -->
    <uses-permission android:name="android.permission.WRITE_MEDIA_AUDIO" />
    <!-- 兼容Android 12及以下的存储权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />        
</manifest>
  • 删除错误的READ_EXTERNAL_WRITE权限(不存在此系统权限)
  • 移除无效的android:requestLegacyExternalStorage(targetSdk34下强制启用分区存储,该属性完全失效)
  • 添加Android 14专属的WRITE_MEDIA_AUDIO权限
  • 给旧版存储权限加android:maxSdkVersion="32",避免在高版本系统中触发不必要的权限申请

2. 调整MAUI权限请求逻辑

Android 14下,Permissions.StorageWrite对应旧版全局存储权限,已不适用于媒体文件写入,需针对音频权限适配:

自定义音频写入权限封装(Android平台)

在MAUI项目的Android平台目录下添加权限实现类:

[assembly: Dependency(typeof(AudioWritePermission))]
namespace YourAppName.Droid
{
    public class AudioWritePermission : IAudioPermission
    {
        private const string Permission = Android.Manifest.Permission.WriteMediaAudio;

        public Task<PermissionStatus> CheckStatusAsync()
        {
            var currentStatus = AndroidX.Core.Content.ContextCompat.CheckSelfPermission(
                Android.App.Application.Context, Permission);
            return Task.FromResult(currentStatus == Android.Content.PM.Permission.Granted 
                ? PermissionStatus.Granted 
                : PermissionStatus.Denied);
        }

        public Task<PermissionStatus> RequestAsync()
        {
            var activity = Platform.CurrentActivity;
            if (activity == null) return Task.FromResult(PermissionStatus.Denied);

            ActivityCompat.RequestPermissions(activity, new[] { Permission }, 1001);
            return CheckStatusAsync();
        }
    }
}

在共享项目中定义权限接口:

public interface IAudioPermission
{
    Task<PermissionStatus> CheckStatusAsync();
    Task<PermissionStatus> RequestAsync();
}

业务代码中请求权限

var audioWritePerm = DependencyService.Get<IAudioPermission>();
var status = await audioWritePerm.CheckStatusAsync();

if (status != PermissionStatus.Granted)
{
    status = await audioWritePerm.RequestAsync();
    if (status == PermissionStatus.Denied && !Permissions.ShouldShowRationale<Permissions.Media>())
    {
        // 用户拒绝且不再提示,引导去设置开启
        var goToSettings = await MainPage.DisplayAlert(
            "权限提示", 
            "需要音频写入权限才能正常使用,请前往应用设置开启", 
            "去设置", 
            "取消");
        
        if (goToSettings)
        {
            var intent = new Android.Content.Intent(
                Android.Provider.Settings.ActionApplicationDetailsSettings,
                Android.Net.Uri.Parse($"package:{Android.App.Application.Context.PackageName}"));
            Android.App.Application.Context.StartActivity(intent);
        }
    }
}

3. 关键注意事项

  • Android 14中WRITE_MEDIA_AUDIO必须用户手动授权,无法静默获取
  • 若仅操作应用私有目录下的音频文件,无需申请上述权限,直接使用FileSystem.AppDataDirectory即可
  • 确保.NET 7 MAUI项目已更新至最新补丁版本,避免权限适配的已知bug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:35:15