Flutter模拟器选择下载目录PDF后路径异常问题咨询
这是FilePicker包的默认行为导致的:它会自动将你选中的文件复制一份到APP的内部缓存目录,然后返回这个副本的路径,而非原文件在模拟器下载目录的真实路径。
原因分析
Android的文件权限机制对跨目录文件访问有严格限制,即使你声明了MANAGE_EXTERNAL_STORAGE等权限,直接访问其他应用/公共目录的文件仍可能存在权限风险。FilePicker通过复制文件到APP私有缓存区的方式,确保你的APP能稳定访问该文件(避免原文件被删除、移动或权限失效导致无法读取)。你看到的/data/user/0/com.example.mindfulreaders_app/cache/file_picker/...就是APP的私有缓存路径,对应的是原文件的副本。
解决方案
如果你需要获取原文件的真实路径,有两种处理方式:
禁止复制到缓存目录
在调用pickFiles时添加copyToCache: false参数,让FilePicker直接返回原文件路径:result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: ['pdf'], copyToCache: false, // 关闭自动复制到缓存的行为 );注意:这种方式需要确保你的APP已获得足够的权限访问原文件所在目录,比如Android 11+中
MANAGE_EXTERNAL_STORAGE权限需要通过permission_handler请求用户手动授权,仅在Manifest中声明是不够的。另外,如果原文件后续被删除或移动,你的APP将无法再访问它。通过Content URI访问原文件
如果不想依赖原文件路径的稳定性,可以通过result.files.single.identifier获取文件的Content URI,然后使用Android原生的ContentResolver来读取文件内容,这种方式更符合Android的文件访问规范,也能避免权限问题。
内容的提问来源于stack exchange,提问作者Yusuf Abdelfattah

