Internal和External Storage
所有的Android设备都有两个文件存储区域:Internal Storage和 External Storage.
名字产生背景
早期的Android设备是由一个内置不可变的,手机都内置(Permanent)一块较小存储板即Internal Storage和一个可移(Removable)的,外置的存储媒介(External Storage,比如SD卡)组成的.
现在有的设备只有一个存储区域,他们将将最初定的“Internal Storage”,即内置存储,分成Internal和External两个分区,这样就不管什么设备都会统一有Internal和External两个分区.
API的行为也就跟是否有可移除的存储媒介无关了.这两总分区的特点总结如下:
区别 | Internal storage | External storage |
可见性 | 一直可见 | 不总是可见,mount了就可见,remove了就不可见 |
访问权限 | 保存在这里的文件默认只有对应app才能访问 | 其他app共享 |
卸载表现 | 保存在此的与app相关的文件会被删除 | 保存在这里的文件除了在getExternalFilesDir()和getExternalCacheDir()文件夹之外,都会保留 |
权限 | 无需 | 需 WRITE_EXTERNAL_STORAGE权限 (注意:getExternalFilesDir()和getExternalCacheDir()这两个路径无需权限) |
适用条件 | app私有数据 | 存放的数据不需要访问限制,为了分享数据或允许其他用户访问 |
使用贴士
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/应用包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/应用包名/cache/目录,一般存放临时缓存数据
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/应用包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。
上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项
一些路径的标准写法
Environment.getExternalStorageDirectory() = /mnt/sdcard
context.getExternalFilesDir() = /mnt/sdcard/Android/data/<application package>/files
context.getExternalCacheDir() = /mnt/sdcard/Android/data/<application package>/cache
context.getFilesDir() = /data/data/<application package>/files
context.getCacheDir() = /data/data/<application package>/cache