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

.NET MAUI 8中READ_EXTERNAL_STORAGE权限请求失败求助

.NET MAUI 8 Android 14 读取外部存储权限被拒的解决方案

核心原因

Android 13(API 33)及以上版本已废弃READ_EXTERNAL_STORAGE权限,替换为细分的媒体权限(针对图片/视频/音频);对于非媒体文件,系统不再允许通过传统存储权限直接访问,需改用文件选择器或特殊权限。你的目标版本是Android 14,仍请求旧权限会被系统直接拒绝。


分场景解决方案

场景1:读取媒体文件(图片、视频、音频)

  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" />
    
  2. 调整权限请求代码
    使用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+禁止通过传统存储权限访问非媒体文件,推荐两种方式:

  1. 使用系统文件选择器(推荐,无需权限)
    借助MAUI的FilePicker让用户主动选择文件,完全规避权限问题:

    var result = await FilePicker.Default.PickAsync(new PickOptions
    {
        PickerTitle = "选择文件"
    });
    if (result != null)
    {
        // 读取文件内容
        using var stream = await result.OpenReadAsync();
        // 后续处理流数据
    }
    
  2. 申请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中权限未被tools:node="remove"意外移除;
  • 测试前卸载旧版本应用,避免权限缓存导致的异常;
  • 避免短时间内重复请求权限,否则会被系统直接拒绝。

内容的提问来源于stack exchange,提问作者Utpal Bharali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:45:15