Flutter中能否使用path_provider将下载文件保存到安卓设备Downloads文件夹
安卓系统下可以通过path_provider包实现将下载的文件存入设备公共Downloads文件夹的需求,需要配合安卓版本适配和权限配置,具体操作如下:
1. 依赖安装
- 在项目的
pubspec.yaml文件中添加path_provider依赖:
dependencies: flutter: sdk: flutter path_provider: ^2.1.0 # 可替换为当前最新稳定版本
- 执行
flutter pub get完成依赖安装。
2. 获取Downloads目录路径
path_provider针对安卓平台提供了独有的getExternalStoragePublicDirectory方法,可以直接获取系统公共存储的各类目录,传入ExternalStorageDirectory.downloads参数即可拿到Downloads文件夹路径,示例代码如下:
import 'dart:io'; import 'package:path_provider/path_provider.dart'; Future<String?> getAndroidDownloadPath() async { if (!Platform.isAndroid) return null; // 获取Downloads公共目录 final? downloadDir = await getExternalStoragePublicDirectory(ExternalStorageDirectory.downloads); return downloadDir?.path; }
拿到路径后拼接目标文件名,就可以将下载的文件直接写入该路径。
3. 安卓权限适配
根据安卓系统版本的不同,需要配置对应权限才能正常写入公共存储目录:
- 安卓9及以下(API ≤28):需要在
android/app/src/main/AndroidManifest.xml的manifest标签下添加读写存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 安卓10/11/12(API 29~32):可以添加
MANAGE_EXTERNAL_STORAGE权限申请全文件访问权限,也可以通过MediaStore接口向Downloads目录写入文件,两种方式均可配合path_provider使用。 - 安卓13及以上(API ≥33):向公共Downloads目录写入自有文件不需要申请额外存储权限,拿到路径后直接写入即可。
4. 注意事项
- 写入文件前可先判断目标目录是否存在,不存在时调用
await downloadDir?.create(recursive: true)递归创建目录,避免写入失败。 - 文件写入完成后如果需要在系统下载应用、文件管理器中立刻看到文件,可调用安卓媒体扫描接口刷新媒体库。
- 该API仅安卓平台可用,调用前必须判断当前运行平台为安卓,避免其他平台运行报错。
内容的提问来源于stack exchange,提问作者Phanindra
相关产品推荐
相关产品推荐

