Android(API 29)10 发布至今已经有很多设备完成升级,如:小米九、Redmi K20pro、华为 P30pro/Mate30pro 、荣耀 v30/v20、Oppo Reno、ONnePlus 7T、谷歌 Pixel 等都已经升级到 Android 10 的支持,很多应用市场也要求应用须要针对 Android 10 进行适配,其中最大的变动之一就是 scoped storage。html
在针对目前 小米、华为、Pixel 的几台 Android 10 手机作了测试,在不设置 requestLegacyExternalStorage
的前提下获得结论(官方还没彻底开启限制的前提):android
一、targetSDK 用 28 编译的在 Android 10 上仍是能够读取到所有文件, 以后覆盖安装一个使用 targetSDK 29 的,还能继续能够访问全路径。ide
二、卸载后直接用 targetSDK 29 编译的会读取不到。测试
而官方明确表示:ui
明年(2020),主要平台版本将要求全部应用都使用分区存储,不管应用的目标 SDK 级别是多少。所以,您应该提早确保您的应用可以使用分区存储。为此,请确保针对搭载 Android 10(API 级别 29)及更高版本的设备启用了该行为。 code
因此不论是使用 requestLegacyExternalStorage
仍是下降 targetSDK
都没法在接下来2020 年的 Android(API 29)10 新版更新中被豁免。cdn
虽然做为 Android 开发会由于没法对用户存储目录“随心所欲”而头痛,可是做为用户倒是感受欣喜的。视频
由于长期以来 Android 用户的本地存储目录都十分杂乱,开发者只要申请一次权限就能够“随心所欲”地建立和读取本地存储,虽然谷歌在 Android 4.4(API 19))引入了存 SAF(Storage Access Framework) , 可是开发者大部分时候都选择无视。htm
我甚至想要一个系统标志出这个文件是谁建立的 API ,由于最近遇到这个问题却没有头绪: 为何相册里老是多出一张空白图片,删了后不久又重现?blog
为了让用户更好地管理本身的文件并减小混乱,Android 10(API 29)开始应用在默认状况下会被要求使用 scoped storage(即分区存储),也就是说应用只能看到本身专有的目录(Context.getExternalFilesDir()
)以及特定类型的媒体文件。
注意这个是强制性的,可是会有缓冲期,官方明确额表示,除非你的应用真的有强烈须要访问专有目录以及
MediaStore
以外的文件,不然最好使用分区存储。
使用分区存储的应用对本身建立的文件始终拥有读/写权限,不管文件是否位于应用的专有目录内。这说明了默认分区存储内的文件也只有应用本身能看到,就像是沙盒内,同时 getExternalFilesDir()
下的文件会随着应用卸载而清除。
也就是说应用能够无需申请任何权限使用 getExternalFilesDir()
、 MediaStore
和 SAF
读写文件,**固然若是使用 MediaStore
读取其余应用的媒体集合时,是须要 READ_EXTERNAL_STORAGE
**。
而 MediaStore
中支持的类型有:
MediaStore.Images
中。MediaStore.Video
中。MediaStore.Audio
中。另外还有其余的限制,好比:
ACCESS_MEDIA_LOCATION
权限,那么访问到的媒体资源中的 Exif
元数据会被修改.MediaStore.Files
也仅显示照片、视频和音频文件,例如不会显示表中的 PDF 文件。总结起来结论就是:
SAF
,利用 ContentResolver
的 Cursor
来提供。MediaStore
和 ContentResolver
,好比保存图片到外部公共存储,拷贝文件到 Download 目录等等。new File(path).exists();
等的判断在公共目录下不能再用了。简单来讲就是:应用在本身的沙盒内能够“随心所欲”,经过 MediaStore
能够分类整理文件,经过 SAF
能够访问其余应用的公共媒体文件。
相关实践操做推荐百度团队的:《Android 10分区存储介绍及百度APP适配实践》