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

Android API 30下已授予存储权限仍报Permission Denied如何解决

Flutter Android API 30 公共目录创建权限报错解决方案

问题根因

Android 11(API 30)进一步收紧了公共存储目录的访问权限,原有适配API 29的Legacy存储方案仅适配普通媒体文件访问,创建自定义公共目录需要额外的权限配置与申请逻辑。

修复步骤

1. 修正AndroidManifest.xml配置

  • 在manifest根标签下新增管理外部存储权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  • 删除现有配置中application标签外多余的android:requestLegacyExternalStorage="true"声明,仅保留application标签内部的即可,避免编译冲突。

2. 升级权限依赖并修改权限申请逻辑

  • 升级permission_handler到适配API 30的最新稳定版,pubspec.yaml中修改为:
permission_handler: ^10.2.0

修改后执行flutter pub get生效。

  • 调整Dart层权限申请逻辑,新增Android 11以上的特殊权限申请,同时补全异步等待逻辑:
import 'dart:io';

// 其他代码保持不变
Future<String> createFolder(String cow) async {
    final folderName = cow;
    final path = Directory("/storage/emulated/0/$folderName");
    // 申请基础存储权限
    var storageStatus = await Permission.storage.status;
    if (!storageStatus.isGranted) {
      await Permission.storage.request();
    }
    // Android 11及以上额外申请管理所有文件权限
    if (Platform.isAndroid && int.parse(Platform.operatingSystemVersion.split(" ")[0].split(".")[0]) >= 11) {
      var manageStatus = await Permission.manageExternalStorage.status;
      if (!manageStatus.isGranted) {
        await Permission.manageExternalStorage.request();
      }
    }
    if (await path.exists()) {
      return path.path;
    } else {
      // 加recursive确保多级目录自动创建,加await等待创建完成
      await path.create(recursive: true);
      return path.path;
    }
}

3. 补全异步调用等待逻辑

现有downloadZipFile方法中调用createFolder时没有加await,会导致文件夹未创建完成就执行后续读写逻辑,修改为:

else{
  debugPrint("Path is empty");
  // 新增await等待文件夹创建完成
  await createFolder("uth_content");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:01