写点什么

Android-10 分区存储介绍及百度 APP 适配实践,三年经验月薪 50k 我是怎么做到的

用户头像
Android架构
关注
发布于: 刚刚

背景


丨 1. 分区存储背景介绍


Google 于 2019 年 9 月 3 日发布了 Android10 release 版本,为了更好的保护用户数据并限制设备冗余文件增加,Android 10 版本变更了设备外部存储访问方式,外部存储新特性称为分区存储(Scoped Storage), 分区存储遵循以下三个原则对外部存储文件访问方式重新设计,便于用户更好的管理外部存储文件


1.1 文件更好的归属:


系统记录文件由哪个应用创建,应用不需要存储权限即可以访问应用自己创建文件


1.2 应用数据保护:


添加外部存储应用私有目录文件访问限制, 应用即使申请了存储权限也不能访问其他应用外部存储私有目录文件


1.3 用户数据保护:


添加 pdf、office、doc 等文件的访问限制,用户即使申请了存储权限也不能访问其他应用创建的 pdf、office、doc 等文件


丨 2. 应用兼容模式


分区存储存在一定的适配成本,Google 为 Android10 版本提供了过渡方案,设置应用以兼容模式运行(详见 2.3), Android11 将不再支持该行为, 各应用需要在 Android11 发版之前完成分区存储适配工作


分区存储新特性介绍


丨 1. 分区存储概览


1.1 分区存储新特性对外部存储进行了重新设计,外部存储被分为应用私有目录以及共享目录两个部分


(1)应用私有目录:存储应用私有数据,外部存储应用私有目录对应 Android/data/packagename,内部存储应用私有目录对应 data/data/packagename;


(2) 共享目录:存储其他应用可访问文件, 包含媒体文件、文档文件以及其他文件,对应设备 DCIM、Pictures、Alarms, Music, Notifications,Podcasts, Ringtones、Movies、Download 等目录


1.2 应用私有目录文件访问


应用私有目录文件访问方式与之前 Android 版本一致,可以通过 file path 获取资源


1.3 共享目录文件访问


共享目录文件需要通过 MediaStore API 或者 Storage Access Framework 方式访问


(1)MediaStore API 在共享目录指定目录下创建文件或者访问应用自己创建文件,不需要申请存储权限


(2)MediaStore API 访问其他应用在共享目录创建的媒体文件(图片、音频、视频), 需要申请存储权限,


未申请存储权限,通过 ContentResolver 查询不到文件 Uri,即使通过其他方式获取到文件 Uri,读取或创建文件会抛出异常;


(3)MediaStore API 不能够访问其他应用创建的非媒体文件(pdf、office、doc、txt 等), 只能够通过 Storage Access Framework 方式访问;


1.4 其他受影响变更


(1) 图片位置信息 一些图片会包含位置信息,因为位置对于用户属于敏感信息, Android 10 应用在分区存储模式下图片位置信息默认获取不到,应用通过以下两项设置可以获取图片位置信息,


在 manifest 中申请 ACCESS_MEDIA_LOCATION


调用 MediaStore setRequireOriginal(Uri uri)接口更新图片 Uri


(2) MediaStore.Files 应用分区存储模式下,MediaStore.Files 集合只能够获取媒体文件信息(图片、音频、视频), 获取不到非 media(pdf、office、doc、txt 等)文件


(3) File Path 路径访问受影响接口


开启分区存储新特性, Andrioid 10 不能够通过 File Path 路径直接访问共享目录下资源,以下接口通过 File 路径操作文件资源,功能会受到影响,应用需要使用 MediaStore 或者 SAF 方式访问



丨 2. 存储特性 Android 版本差异概览



丨 3. 兼容模式


3.1 兼容模式设置


应用未完成外部存储适配工作,可以临时以兼容模式运行, 兼容模式下应用申请存储权限,即可拥有外部存储完整目录访问权限,通过 Android10 之前文件访问方式运行,以下两种方法设置应用以兼容模式运行


(1)Target 小于等于 Android 9 (API level 28)


(2)Tagret 大于等于 Android 10(API level 29), 在 manifest 中设置 requestLegacyExternalStorage 属性为 true


3.2 判断兼容模式接口


Environment.isExternalStorageLegacy()


返回值


true : 应用以


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


兼容模式运行


false:应用以分区存储特性运行


丨备注


应用已完成存储适配工作且已打开分区存储开关,如果当前应用以兼容模式运行,覆盖安装后应用仍然会以兼容模式运行,卸载重新安装应用才会以分区存储模式运行


分区适配方案


丨 1. 分区存储适配方案概览


分区存储适配包含文件迁移以及文件访问兼容性适配两个部分;


1.1 文件迁移


文件迁移是将应用共享目录文件迁移到应用私有目录或者 Android10 要求的 media 集合目录


(1)针对只有应用自己访问并且应用卸载后允许删除的文件,需要迁移文件到应用私有目录文件,可以通过 File path 方式访问文件资源,降低适配成本

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android-10分区存储介绍及百度APP适配实践,三年经验月薪50k我是怎么做到的