Flutter在Android中访问外部目录文件为空,添加权限仍无效求助
解决Flutter在Android上无法列出目录文件的问题
问题核心
你的代码逻辑本身无语法错误,但在Android 10(API 29)及以上版本中,Scoped Storage机制限制了应用对外部存储的访问范围,仅添加READ_EXTERNAL_STORAGE权限已经不足以遍历任意目录下的文件;同时Android 6+要求运行时动态申请权限,仅在Manifest中声明权限无法生效。
具体解决方案
1. 适配Android版本的存储权限配置
- 若应用目标SDK为29/30,在
AndroidManifest.xml的application标签中添加兼容属性,临时启用旧存储访问逻辑:
<application ... android:requestLegacyExternalStorage="true"> ... </application>
- 若目标SDK为31+,需申请全存储访问权限,在
AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
2. 动态申请运行时权限
使用permission_handler插件处理权限申请:
- 先在
pubspec.yaml添加依赖:
dependencies: permission_handler: ^10.2.0
- 修改代码,先完成权限校验再访问目录:
import 'package:permission_handler/permission_handler.dart'; void _pickDirectory() async { // 校验并申请存储权限 PermissionStatus status; if (await Permission.manageExternalStorage.isGranted || await Permission.storage.isGranted) { status = PermissionStatus.granted; } else { // 先申请基础存储权限 status = await Permission.storage.request(); // Android 11+需额外申请全存储权限 if (status.isDenied && await Permission.manageExternalStorage.isDenied) { status = await Permission.manageExternalStorage.request(); } } if (status.isGranted) { final path = await FilePicker.platform.getDirectoryPath(); if (path == null) { print('Canceled'); } else { final directory = Directory(path); // 可指定recursive参数控制是否遍历子目录 final files = directory.listSync(recursive: false); print(files); } } else { print('存储权限未授权,无法访问目录'); } }
3. 验证目录路径有效性
先打印path的值确认是否为预期目录,部分系统特殊目录(如系统根目录、其他应用私有目录)即使授权也无法访问,建议选择普通用户目录(如Download、Documents)测试。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

