Flutter中如何获取Android与iOS端的下载文件夹目录
Flutter获取Android、iOS下载目录实现方案
前置准备
- 在项目
pubspec.yaml的dependencies下添加官方维护的路径插件依赖:
dependencies: path_provider: ^2.1.2
- 执行
flutter pub get完成依赖安装。 - 按平台要求配置清单权限:
- Android:在
android/app/src/main/AndroidManifest.xml的<application>标签下添加android:requestLegacyExternalStorage="true"兼容安卓10分区存储;安卓10以下版本需要在<manifest>标签下添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />写权限。 - iOS:如果需要让用户在系统「文件」APP中看到你存的文件,在
ios/Runner/Info.plist中添加以下配置:
- Android:在
<key>LSSupportsOpeningDocumentsInPlace</key> <true/> <key>UIFileSharingEnabled</key> <true/>
分平台实现逻辑
Android平台
安卓从分区存储机制上线后,Android 11(API 30)及以上版本,应用向公共下载目录写入自身创建的文件不需要申请任何存储权限,写入的文件会直接显示在系统文件管理器的下载分类下。
不要硬编码/storage/emulated/0/Download这类固定路径,部分定制ROM、平板设备的公共存储挂载点有差异,直接用插件提供的方法获取路径兼容性最好,代码示例:
Future<Directory> getAndroidDownloadPath() async { // 直接获取系统映射的公共下载目录 final downloadDirs = await getExternalStorageDirectories( type: StorageDirectory.downloads ); return downloadDirs.first; }
iOS平台
iOS不存在全局可直接写入的公共下载目录,受沙箱机制限制,所有应用只能访问自身沙箱内的目录,任何尝试绕过沙箱写入系统目录的代码都会被App Store审核驳回。
合规场景下只能获取应用沙箱内的Downloads目录,配置完前面说的文件分享权限后,用户可以在系统「文件」APP中,找到对应应用名称的文件夹查看下载的文件,也可以手动将文件移动到系统公共下载目录,应用本身没有权限直接操作沙箱外的文件。
路径获取代码示例:
Future<Directory> getiOSDownloadPath() async { // 返回沙箱内的Downloads目录 return await getDownloadsDirectory(); }
跨平台统一调用封装
直接封装一个通用方法,自动判断平台返回对应可写入的下载路径,附带文件写入示例:
import 'dart:io'; import 'package:path_provider/path_provider.dart'; /// 跨平台获取可写入的下载目录 Future<Directory> getAvailableDownloadDir() async { if (Platform.isAndroid) { final dirs = await getExternalStorageDirectories(type: StorageDirectory.downloads); return dirs.first; } else if (Platform.isIOS) { return await getDownloadsDirectory(); } throw UnsupportedError('当前平台暂不支持下载目录获取'); } /// 将字节数据写入下载目录 Future<File> writeToDownloadDir(String fileName, List<int> fileBytes) async { final downloadDir = await getAvailableDownloadDir(); final targetFile = File('${downloadDir.path}/$fileName'); // 路径不存在时自动创建目录 if (!await targetFile.parent.exists()) { await targetFile.parent.create(recursive: true); } return targetFile.writeAsBytes(fileBytes); }
踩坑提示
- Android 13+如果需要读取下载目录内非本应用创建的非媒体文件,不能直接申请权限读取,必须调用系统文件选择器让用户手动授权选中对应文件,否则会抛出权限异常。
- iOS端如果没有配置前面说的两个Info.plist权限,存在沙箱内的文件用户在系统文件APP里看不到,只能在应用内访问。
- 不要使用第三方的路径修改类插件强行写入iOS系统目录,100%会在App Store审核阶段被拒。
内容的提问来源于stack exchange,提问作者DiyorbekDev
相关产品推荐
相关产品推荐

