名词介绍: Android 10+ 表示android系统版本大于等于10 既包括android 10以及android 11的系统统称
Android 10+ 概述
Android 10系统开始 进一步增强了平台功能,为外部存储设备上的应用和用户数据提供了更好的保护。作为这项工作的一部分,平台引入了进一步的改进,以简化向分区存储的转换。
为了让用户更好地控制自己的文件,保护用户隐私数据,并限制文件混乱情况,Android 11在分区存储基础上限制了应用访问其他应用的文件。
分区存储
先说一下为什么会有分区存储
这个机制出现。
在分区存储之前,某些应用中,即使功能很简单,大部分都不需要这么宽泛的权限。
这就使得某些应用程序
1、乱占空间 :各种各样的文件散布在磁盘的各个地方,当用户卸载应用之后,这些被遗弃的文件被滞留在原地,无人管理,占用了磁盘空间,最终结果就会导致磁盘不足
2、随意读取用户的数据
3、随意读取应用的数据
因此分区存储
诞生了,限制了过于宽泛的 存储权限。
什么是分区存储
?
Google针对外部存储引入了一个新特性,它的名字叫:Scoped Storage,Google官方对它的翻译为分区存储,我们也可以把它叫做沙盒存储。
更明确了空间的归属,也就是对目录有一个更明确的所有权结构。
分区存储是一种安全机制,用于防止应用读取其他应用的数据。
- 每个应用程序都有自己的存储空间。
- 应用程序不能翻过自己的目录,去访问公共目录。
- 应用程序请求的数据都要通过权限检测,不符合要求不会被放行。
分区存储机制下uni-app/5+ 开发者的影响
android 9及以下系统未做分区存储,除其他应用的内部存储空间不可以读写,其他任意存储目录下的资源文件都可以正常读写操作。
android 10仅对targetSdkVersion>=29则会开启分区存储。targetSdkVersion小于29则不会有任何限制与android9及以下同理。
andorid 11强制执行分区存储。不允许应用读写操作非应用沙盒目录和系统公共目录下的资源文件。
dcloud已对分区存储机制做了适配工作。但也增加了开发者对文件目录操作的规则。在分区存储的环境下分出两个可操文件数据目录系统公共目录
和应用沙盒目录
.
系统公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等
- 公共目录的文件在App卸载后,不会删除
- 通过plus.gallery.pick获取
- 拥有权限,也能通过路径直接访问
公共目录对照表:
- Downloads 对应的绝对路径
file:///storage/emulated/0/Download
- Documents 对应的绝对路径
file:///storage/emulated/0/Documents
- Pictures 对应的绝对路径
file:///storage/emulated/0/Pictures
- DCIM 对应的绝对路径
file:///storage/emulated/0/DCIM
- Movies 对应的绝对路径
file:///storage/emulated/0/Movies
- Music 对应的绝对路径
file:///storage/emulated/0/Music
- Ringtones 对应的绝对路径
file:///storage/emulated/0/Ringtones
系统公共目录
缺陷:
-
系统公共目录
仅支持读取媒体文件 如:音频文件、视频文件、图片文件。其他类型文件不支持!!!! -
系统公共目录
下创建的文件是公用的,你需要确保你的文件命名是惟一的。否则会出现名称对应不上的问题。多数重命名会文件名尾部(i++)处理 -
系统公共目录
不可随意删减。该文件谁创建的谁才有权限删除修改。如果不是当前应用创建的文件是无权权限删改的。 -
系统公共目录
删减文件会被系统认为恶意操作。将会弹通知栏。告诫手机用户当前XXX应用删除了什么文件。
系统公共目录
地址的获取来源是哪里:
这里多数是通过plus.gallery.pick获取到的媒体文件。如图片视频等。多数是DCIM、Pictures、Movies等。其他Ringtones、Documents仅提供绝对路径让开发者对比,实际业务中可能并不会获取到相关路径目录的。
目前业务逻辑会用到系统公共目录
多数为分享。需要将图片等资源拷贝到系统公共目录
下。别的三方应用才有权读取该文件。进行操作业务逻辑。
应用沙盒目录(应用专属目录)
- 应用沙盒目录只能自己直接访问
- App卸载,数据会清除。
应用沙盒目录分为:
-
内部存储空间目录
plus.io.PRIVATE_WWW 对应绝对路径
file:///data/user/0/%PACKAGENAME%/files/apps/%APPID%/www
plus.io.PRIVATE_DOC 对应绝对路径
file:///data/user/0/%PACKAGENAME%/files/apps/%APPID%/doc
-
外部存储空间目录
plus.io.PUBLIC_DOCUMENTS 对应绝对路径
file:///storage/emulated/0/Android/data/%PACKAGENAME%/.%APPID%/documents
plus.io.PUBLIC_DOWNLOADS 对应绝对路径
file:///storage/emulated/0/Android/data/%PACKAGENAME%/.%APPID%/downloads
具体请参考文档
以下是针对分区存储
机制作出文件操作目录限制的5+API:
- plus.io中的getAudioInfo、getVideoInfo、getFileInfo、getImageInfo仅支持应用沙盒目录和系统公共目录
- plus.io中的DirectoryEntry对象的removeRecursively、getDirectory、getFile、remove、copyTo、moveTo仅支持应用沙盒目录
- plus.io中的DirectoryEntry对象的getMetadata 、getParent仅支持应用沙盒目录和系统公共目录
- DirectoryReader.readEntries仅支持应用沙盒目录和系统功能目录
- FileWriter.write、FileWriter.truncate、FileReader.readAsText仅支持应用沙盒目录
- plus.camera.CameraOptions中的filename仅支持应用沙盒目录。
- plus.gallery.save中的path仅支持应用沙盒目录。
- plus.zip.compress中的src、zipfile仅支持应用沙盒目录。
- plus.zip.decompress中的zipfile、target仅支持应用沙盒目录。
- plus.zip.CompressImageOptions中的dst仅支持应用沙盒目录、src仅支持应用沙盒目录和系统公共目录。
- plus.map相关的plus.maps.Marker.setIcon、setIcons、plus.maps.Bubble.setIcon图片地址仅支持应用沙盒目录。
- plus.nativeObj.Bitmap.save中的path 仅支持应用沙盒目录。
- plus.video.VideoPlayerStyles中的src仅支持应用沙盒目录和系统公共目录。
- plus.nativeUI.toast自定义ToastStyles后android11设备不支持应用进入后台弹出toast显示。
以上API设置了不支持的目录部分会返回code =15的错误信息!,部分会返回执行失败的错误回调具体以API为准!
建议
可预见的未来android系统的更新将会对存储数据操作更加严格。推荐广大开发者文件数据操作都在应用本身的沙盒目录下完成。减少未来不必要的适配工作。相对的你的应用也会更加安全可靠。
扩展问题:
Q:分区存储
我的应用那些需要改动?
A: 目前应用多数与文件操作数据都已适配。用户只需关注部分API操作的文件路径是否符合目录限制规则。非应用沙盒目录
或非系统公共目录
请及时修改或增加判断调整业务逻辑。
Q:我是不是只要targetSdkVersion不设置>=29就可以了?
A: 不是在android11的设备已经强制开启分区存储
机制。您必须做出适配。否则在android11的设备上无法正常运行。
Q:我是不是可以将所以之前应用的特殊文件都放入到系统公共目录
下不就行了。之后也可以随意操作不需要非要在应用沙盒目录
操作文件呀。
A: 首先不推荐这样操作的。这样会导致功系统公共目录
下的文件激增导致多应用做操出现的文件名称冲突等问题。`系统公共目录还有个明显缺陷就是不可以随意删除、修改。都会被系统判断为恶意删减或无权限修改。造成业务逻辑错误。