Android 11设备使用path_provider创建路径遇权限问题求助
解决方案:Android 11 下 path_provider 创建路径权限被拒问题
问题原因
Android 11 引入了分区存储(Scoped Storage),限制APP直接访问根目录下的自定义文件夹,默认仅允许APP访问自身专属目录和媒体文件目录。你直接创建/storage/emulated/0/UniDownloader属于访问公共根目录,触发了系统权限拦截。另外,即便申请了READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE,Android 11+ 也不再授予这类权限对公共根目录的写入权限。
具体解决步骤
1. 改用 path_provider 提供的合法公共目录
避免硬编码路径,使用path_provider的标准API获取公共存储目录,再在其下创建子文件夹:
import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<Directory> getAppDownloadDir() async { // 获取公共下载目录(适配Android 10+) List<Directory>? dirs = await getExternalStorageDirectories(type: StorageDirectory.downloads); Directory? downloadDir = dirs?.first; if (downloadDir != null) { Directory appDir = Directory('${downloadDir.path}/UniDownloader'); if (!await appDir.exists()) { await appDir.create(recursive: true); } return appDir; } throw Exception("无法获取公共存储目录"); }
2. 申请对应权限
在AndroidManifest.xml中添加权限声明:
<!-- Android 10及以下所需权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 11+ 访问公共根目录需申请特殊权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
MANAGE_EXTERNAL_STORAGE是特殊权限,需引导用户手动开启:
import 'package:permission_handler/permission_handler.dart'; Future<bool> checkStoragePermission() async { if (await Permission.manageExternalStorage.isGranted) { return true; } else { var status = await Permission.manageExternalStorage.request(); if (status.isDenied) { openAppSettings(); } return await Permission.manageExternalStorage.isGranted; } }
3. 优先使用APP专属存储(推荐)
如果无需在公共目录展示文件,优先用APP专属存储,无需额外权限:
// 获取APP专属外部存储目录 Directory appDocDir = await getApplicationDocumentsDirectory(); Directory appDir = Directory('${appDocDir.path}/UniDownloader'); if (!await appDir.exists()) { await appDir.create(recursive: true); }
4. Android 10 过渡配置(可选)
若需兼容Android 10,在AndroidManifest.xml的<application>标签中添加:
android:requestLegacyExternalStorage="true"
此配置仅在Android 10生效,可绕过分区存储限制,Android 11+ 无效。
关键注意事项
- 禁止硬编码存储路径,始终依赖path_provider提供的API获取目录
- Android 11+ 下,
MANAGE_EXTERNAL_STORAGE仅适用于文件管理类APP,普通APP尽量使用专属存储或公共媒体目录 - 权限需在运行时动态请求,不能仅依赖Manifest声明
内容的提问来源于stack exchange,提问作者mridhul_42
相关产品推荐
相关产品推荐

