Android 11 SAF 如何在不复制大文件的前提下获取Java.IO.File对象
Android 11 SAF适配中为Mapsforge离线地图API获取java.io.File对象的问题
已完成的适配进度
- 推进Android 11(API 30)合规迁移、适配存储访问框架(SAF)的过程中,应用内部文件存储已统一改用
FilesDir路径管理 - 基于
MediaStoreAPI实现的图片获取功能运行稳定,未出现兼容性问题
遇到的核心障碍
- 应用集成
MapsforgeAPI实现离线地图功能,该API加载自定义地图文件时强制要求传入由本地真实路径生成的java.io.File对象,不支持流、Uri这类抽象的资源标识作为入参 - 待加载的自定义
.map文件体积接近2GB,不属于应用内置资源,完全由用户自主下载、放置在设备存储的任意位置供应用调用 - 引导用户通过SAF选择存储内的地图文件时,系统返回的是
Android.Net.Uri对象;常规的Uri转File实现需要把整个文件内容复制到应用沙箱目录,这个过程会额外占用近2GB的设备存储空间,完全不具备可行性
待解决的核心疑问
- 是否存在合规实现方案,可通过SAF获取能被代码直接使用的
java.io.File对象,无需复制大体积文件内容? - 如果不存在上述实现方案,Android 11的存储访问限制是否会导致用户无法自主管理这类大体积的自定义应用资源、占用不必要的存储空间?
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

