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

C# .NET7 MAUI在Android API33上存储权限被拒问题排查

Android 13(API33)MAUI FolderPicker权限异常:问题根源与操作失误分析

问题根源

  1. Android 13存储权限模型的根本性变更
    Android 13彻底废弃了旧的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限,改用READ_MEDIA_*系列权限管理媒体文件访问。同时MANAGE_EXTERNAL_STORAGE是Google严格管控的特殊权限,仅允许文件管理器、备份类等特定类型应用申请,普通应用请求该权限会被系统直接拒绝,不会弹出授权弹窗。

  2. CommunityToolkit.Maui FolderPicker的权限检查逻辑
    从异常栈可知,FolderPicker的Android实现会验证存储相关权限是否全部授予。当你的应用清单和自定义权限中包含无法被授予的MANAGE_EXTERNAL_STORAGE时,权限检查会直接返回denied,触发Storage permission is not granted异常。

操作失误点

  • 冗余权限过度添加:在AndroidManifest.xml和自定义GalleryPermissions中加入了大量无效或不必要的权限,比如MANAGE_EXTERNAL_STORAGE、MANAGE_MEDIA、MEDIA_CONTENT_CONTROL,甚至拼写错误的READ_STORAGE_PERMISSION(正确应为READ_EXTERNAL_STORAGE),这些权限不仅无意义,还直接干扰了权限检查流程。
  • 未针对API版本做权限适配:没有根据Android 13的权限模型调整权限配置,仍沿用旧版本的权限逻辑,同时错误引入特殊权限MANAGE_EXTERNAL_STORAGE,导致权限请求始终失败。
  • 自定义权限检查逻辑不合理:一次性请求过多无关权限,只要其中一个权限(如MANAGE_EXTERNAL_STORAGE)无法授予,整个自定义权限的状态就会标记为denied,进而导致FolderPicker调用失败。

正确修复方案(已验证有效)

  1. 清理冗余权限
    从AndroidManifest.xml中删除以下权限:

    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_MEDIA" />
    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
    <uses-permission android:name="android.permission.READ_STORAGE_PERMISSION" />
    

    并为旧权限添加版本限制:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    

    保留Android 13所需的媒体权限:

    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    
  2. 优化自定义权限检查
    根据API版本动态适配所需权限:

    internal class GalleryPermissions : BasePlatformPermission
    {
    #if ANDROID
        public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
            Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Tiramisu
                ? new[]
                {
                    ("android.permission.READ_MEDIA_IMAGES", true)
                }
                : new[]
                {
                    ("android.permission.WRITE_EXTERNAL_STORAGE", true),
                    ("android.permission.READ_EXTERNAL_STORAGE", true)
                };
    #endif
    }
    
  3. 简化权限检查流程
    调用FolderPicker前仅检查当前API版本所需的权限,避免包含特殊权限或无效权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:44:56