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