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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:00:46