在api 28 29 30 31 33都进行测试过。

/是根目录

  1. /data/data/com.xxx.xxx/…
  2. 首先 /sdcard/、/storage/self/primary/ 真正指向的是/storage/emulated/0/,所以用x表示这三者。x/Android/data/com.xxx.xxx/…
  3. x/[DCIM, Alarm, Pictures]
  4. x下其他目录,比如 x/qq

1、2都是特定应用的,特点是路径有包名。这两个目录本App无需申请访问权限即可申请,其它App也无法访问本App的目录。

1称为 internal storage,2称为 external storage的应用专属目录。

3我称之为 external public storage。

4称之为其他目录

1、2不受分区存储影响。

4我不会。

在本文就研究对于3分区存储的影响(表现在9以前,10,11以后这三个版本不同)

各个版本对于external public的不同反应

9 以下 10 11 以上
需要写权限 不需要权限 不需要权限
需要写权限。本应用和其他应用都可删 不需要权限,但只能删自己;删其他应用需要在弹出的Dialog确认 不需要权限,但只能删自己;删其他应用需要在弹出的Dialog确认
需要读权限。本应用和其他应用都可查 不需要权限,但只能查自己;有权限后,本应用和其他应用都可查 不需要权限,但只能查自己;有权限后,本应用和其他应用都可查

申请权限跑我那个函数就行。适配到Api33。

9以下好像在多少版本以前,是在Manifest声明READ,,,和WRITE就行,之后才是运行时请求。不想不区分这个,9以下就运行时请求就对了,有的话就直接通过了,不用区分。

我写了一套函数,用于操作 1 2 3 区域(目前只是Image,本文讲的都是 媒体文件,txt等文档需要用SAF,去下面官网链接看看),这些函数都是全版本适用的,向后(backward)兼容。

参考

juejin

不怎么的官网

Philipp系列视频

最后附上我的demo