You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中添加以下配置:
<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:27:26