在开发app的过程中,需要保存一些数据,这时就会遇到各种存储路径,sdcard/、storage/sdcard0、mnt/sdcard等等,会让人很难以理解。这其中的很多路径都是指向同一个路径,有点指针的味道。
其中的sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一个路径的不同”指针“,说到底都是内部存储,真正的外部存储卡是mnt/sdcard2和storage/sdcard1,通过Environment.getExternalStorageDirectory函数获取的还是内部存储卡。
查看官方文档和测试发现,在api 19和以上版本调用getExternalFilesDirs时会同时能够获取到内部和外部sdcard,内部是获取到的storage/emulated/0的存储路径,外部获取的是storage/sdcard1的存储路径,通过用兼容包中的ContextCompat.getExternalFilesDirs函数也能达到相同的效果。相比之下,getExternalFilesDir 这个只是得到主外部存储目录,默认是内部存储中的storage/emulate/0。官方文档中说6.0以后采取了adoptable storage,可以将应用安装在外部存储空间了,只需要将外部存储空间设置成主外部存储目录。Android官方文档说明(需翻墙)
其中的mnt目录是Linux本身就带有的,Android还应用了fuse技术。再往下挖掘就到了Linux内部的filesystem了。