C# .NET7 MAUI在Android API33上存储权限被拒问题排查
Android 13(API33)MAUI FolderPicker权限异常:问题根源与操作失误分析
问题根源
Android 13存储权限模型的根本性变更
Android 13彻底废弃了旧的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限,改用READ_MEDIA_*系列权限管理媒体文件访问。同时MANAGE_EXTERNAL_STORAGE是Google严格管控的特殊权限,仅允许文件管理器、备份类等特定类型应用申请,普通应用请求该权限会被系统直接拒绝,不会弹出授权弹窗。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调用失败。
正确修复方案(已验证有效)
清理冗余权限
从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" />优化自定义权限检查
根据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 }简化权限检查流程
调用FolderPicker前仅检查当前API版本所需的权限,避免包含特殊权限或无效权限。
内容的提问来源于stack exchange,提问作者computercarguy
相关产品推荐
相关产品推荐

