Android 10使用MANAGE_EXTERNAL_STORAGE权限异常,Android 11正常求助
问题原因
MANAGE_EXTERNAL_STORAGE是Android 11(API 30)才新增的系统权限,Android 10(API 29)及以下系统完全不识别这个权限,你在Android 10设备上请求该权限时,系统就会抛出“no permissions found in manifest for 22”的错误。
解决方案
1. 修正Manifest权限配置
给MANAGE_EXTERNAL_STORAGE权限添加android:maxSdkVersion="30",让低版本系统自动忽略这个权限声明:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:maxSdkVersion="30" tools:ignore="ScopedStorage" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2. 权限请求代码做版本适配
只有在Android 11及以上版本才请求MANAGE_EXTERNAL_STORAGE,Android 10及以下仅请求常规存储权限:
void getPermission() async { bool hasStoragePermission = false; bool hasManagePermission = true; // 请求基础存储权限 var status = await Permission.storage.request(); hasStoragePermission = status.isGranted; // 仅Android 11+设备请求MANAGE_EXTERNAL_STORAGE if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 30) { var status3 = await Permission.manageExternalStorage.request(); hasManagePermission = status3.isGranted; } } if (hasStoragePermission && hasManagePermission) { setState(() { _allowWriteFile = true; }); } else { // 处理权限拒绝后的逻辑 } }
注:上述代码需要依赖device_info_plus库获取系统版本;如果使用的是permission_handler 10+版本,也可以直接用Permission.platform.isAndroid11OrLater替代版本判断逻辑。
额外优化建议
Android 10采用范围存储策略,即使申请了WRITE_EXTERNAL_STORAGE,也仅能访问应用私有目录和媒体文件。如果你的下载文件是非媒体类型,建议直接存储到应用私有目录(比如getExternalFilesDir(null)),这样无需申请存储权限,还能避开范围存储的限制。
内容的提问来源于stack exchange,提问作者Navjot Aulakh
相关产品推荐
相关产品推荐

