Android 11/R分区存储概念及权限特性的变更

为什么要推行分区存储?

在Android 10/Q之前应用开发者只要获取了WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE的权限后就能在sdcard/目录下肆无忌惮的创建文件和读取内容,而且这些被创建出来的文件不会随着应用卸载而删除,久而久之,用户手机的sdcard/目录下就会如杂草一般遍地开花,文件目录变得臃肿杂乱,而且应用之间创建的文件还会被彼此读取,就显得很不规范也不安全。
基于此,Google爸爸终于下定决心整治,于是推出了分区存储的概念,应用按照创建文件的类型(图片/音频/视频/文档)放到Google规划好的地方。

Android存储区域划分

Android 中存储可以分为两大类:私有存储和共享存储
  • 私有存储 (Private Storage) : 每个应用在都拥有自己的私有目录,其它应用看不到,彼此也无法访问到该目录,和以前的版本一致,可通过 File() API 访问,无需申请权限,且会随着app卸载而删除:

    1.内部存储私有目录 (/data/data/packageName),通过getFilesDir() 或者getCacheDir()访问 。
    2.外部存储私有目录 (/sdcard/Android/data/packageName),通过getExternalFilesDir() 或者 getExternalCacheDir()、Storage Access Framework访问。


    内部存储私有目录

    外部存储私有目录
  • 共享存储 (Shared Storage) : 存储其他应用可访问文件, 包含媒体文件、文档文件以及其他文件,对应sdcard/DCIM、Pictures、Alarms、Music、Notifications、Podcasts、Ringtones、Movies、Download等目录。该目录下的文件不会随着app卸载而删除,其访问权限划分如下。
    1.无需申请权限的操作:
    通过 MediaStore API对媒体集、文件集进行媒体/文件的添加、对 自身APP 创建的 媒体/文件 进行查询、修改、删除的操作。
    2.需要申请READ_EXTERNAL_STORAGE 权限:
    通过 MediaStore API对所有的媒体集进行查询、修改、删除的操作。
    3.调用 Storage Access Framework API :
    会启动系统的文件选择器向用户申请操作指定的文件
    Android10/Q以下的版本通过Environment.getExternalStorageDirectory()访问共享存储的文件,就是我们之前常用的那种胡来乱搞的文件操作,Android10/Q版本是个过渡版本,此时如果在AndroidMinifest文件application节点下加入android:requestLegacyExternalStorage="true"则表示暂不使用分区存储,还是沿用以前的存储模式,但是Android11/R版本将会强制使用分区模式,此时Environment.getExternalStorageDirectory()方式将不可用,转而使用MediaStore API来操作文件。
分区存储特性

概念介绍就到这里,下篇研究一下分区存储的适配方案和文件操作MediaStore API。

你可能感兴趣的:(Android 11/R分区存储概念及权限特性的变更)