Flutter安卓端如何将任意类型文件下载到外部存储Downloads目录
Flutter本身支持安卓端将文件下载到公共Downloads目录,受Android 10(API 29)开始推行的分区存储政策限制,无法直接通过路径写入公共目录,你提到的ext_storage、downloads_path_provider等包均未适配该政策且已停止维护,因此无法满足需求。2021年10月阶段可使用以下稳定方案实现需求:
可用实现方案
- 方案1:使用
media_store第三方包
该包专门适配Android分区存储规则,支持任意格式文件写入公共Downloads、相册等目录,API 29及以上无需申请存储权限。使用流程为:先将目标文件下载到应用专属沙箱缓存目录,再调用包提供的插入接口将文件写入公共Downloads媒体库即可,系统会自动完成文件写入和同步,普通用户可直接在系统下载目录找到目标文件。API 28及以下版本需要额外申请WRITE_EXTERNAL_STORAGE权限兼容。 - 方案2:自行实现Flutter原生平台通道
无需依赖第三方包,在安卓原生层通过Kotlin/Java编写MediaStore接口写入逻辑,Flutter层通过MethodChannel将文件本地缓存路径、文件名、MIME类型等参数传递到原生层,原生层完成公共Downloads目录的写入操作。该方案灵活度最高,可自定义所有写入逻辑,不存在第三方包停止维护的风险。 - 方案3:使用
flutter_downloader包(1.7.0及以上版本)
该版本已经完成Android 10+分区存储适配,在AndroidManifest.xml中配置android:requestLegacyExternalStorage="true"后,可直接指定下载路径为公共Downloads目录,包内部会自动处理MediaStore写入逻辑,同时支持断点续传、后台下载、进度监听等能力,适合大文件下载场景。
url_launcher调用浏览器下载的适用性分析
该方案是否为最优方案取决于实际业务场景:
- 如果仅需要下载公开的线上文件,不需要自定义下载逻辑、不需要监听下载进度、下载完成后无需在App内做后续操作,该方案是成本最低的选择:不需要适配存储权限,调用系统浏览器下载管理器后,文件会自动存入公共Downloads目录,稳定性极高。
- 如果存在App内本地文件导出到公共目录、需要自定义下载通知、需要监控下载进度、下载完成后需要App内二次处理等需求,该方案完全不适用,建议选择上述三种方案。
内容的提问来源于stack exchange,提问作者Zelf
相关产品推荐
相关产品推荐

