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
相关产品推荐
相关产品推荐

