.NET MAUI 8中READ_EXTERNAL_STORAGE权限请求失败求助
.NET MAUI 8 Android 14 读取外部存储权限被拒的解决方案
核心原因
Android 13(API 33)及以上版本已废弃READ_EXTERNAL_STORAGE权限,替换为细分的媒体权限(针对图片/视频/音频);对于非媒体文件,系统不再允许通过传统存储权限直接访问,需改用文件选择器或特殊权限。你的目标版本是Android 14,仍请求旧权限会被系统直接拒绝。
分场景解决方案
场景1:读取媒体文件(图片、视频、音频)
更新AndroidManifest.xml权限配置
移除旧的READ_EXTERNAL_STORAGE,添加适配不同Android版本的权限:<!-- Android 13+ 媒体权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- 兼容Android 12及以下版本 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />调整权限请求代码
使用MAUI封装的对应媒体权限请求,而非通用的StorageRead(也可继续用StorageRead,MAUI会自动适配API级别):// 示例:请求图片读取权限 var status = await Permissions.RequestAsync<Permissions.MediaImage>(); if (status != PermissionStatus.Granted) { // 处理权限拒绝逻辑,比如提示用户开启权限 } // 若需读取所有媒体类型,可直接请求StorageRead var storageStatus = await Permissions.RequestAsync<Permissions.StorageRead>();
场景2:读取非媒体文件(文档、压缩包等)
Android 13+禁止通过传统存储权限访问非媒体文件,推荐两种方式:
使用系统文件选择器(推荐,无需权限)
借助MAUI的FilePicker让用户主动选择文件,完全规避权限问题:var result = await FilePicker.Default.PickAsync(new PickOptions { PickerTitle = "选择文件" }); if (result != null) { // 读取文件内容 using var stream = await result.OpenReadAsync(); // 后续处理流数据 }申请MANAGE_EXTERNAL_STORAGE权限(仅特殊应用使用)
仅适用于文件管理器、备份工具等需全局访问存储的应用,Google Play审核严格:- 配置AndroidManifest.xml:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> - 请求权限并引导用户手动开启:
var status = await Permissions.RequestAsync<Permissions.StorageWrite>(); if (status != PermissionStatus.Granted) { // 跳转到应用设置页面让用户手动开启权限 AppInfo.ShowSettingsUI(); }
- 配置AndroidManifest.xml:
额外检查项
- 确认
AndroidManifest.xml中权限未被tools:node="remove"意外移除; - 测试前卸载旧版本应用,避免权限缓存导致的异常;
- 避免短时间内重复请求权限,否则会被系统直接拒绝。
内容的提问来源于stack exchange,提问作者Utpal Bharali
相关产品推荐
相关产品推荐

