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
相关产品推荐
相关产品推荐

