路径取得方法 | APP专用 | 非root用户可见 | APP卸载时 | |
---|---|---|---|---|
内部数据空间 | Context.getFilesDir() | yes | no | 消失 |
内部缓存空间 | Context.getCacheDir() | yes | no | 消失 |
外部数据空间 | Context.getExternalFilesDir(String type) | yes | yes | 消失 |
外部缓存空间 | Context.getExternalCacheDir() | yes | yes | 消失 |
外部公开空间 | Environment.getExternalStorageDirectory() | no | yes | 不消失 |
外部公开共享空间 | Environment.getExternalStoragePublicDirectory(String type) | no | yes | 不消失 |
内部空间 只有APP自己可以访问,其他APP和手机用户都不可以见。卸载消失。
外部空间 APP自己,手机用户,其他授权APP可以访问。卸载消失
公开空间,所有APP都可以访问。卸载不消失。
Context.getFilesDir() :/data/data/com.example/files
Context.getCacheDir() :/data/data/com.example/cache
Context.getExternalCacheDir() :/storage/emulated/0/Android/data/com.example/cache
Context.getExternalFilesDir() :/storage/emulated/0/Android/data/com.example/files
Environment.getExternalStorageDirectory() :/storage/emulated/0
Environment.getExternalStoragePublicDirectory() :/storage/emulated/0/
路径取得方法 | APP专用 | 非root用户可见 | APP卸载时 | |
---|---|---|---|---|
内部数据空间 | Context.getFilesDir() | yes | no | 消失 |
内部缓存空间 | Context.getCacheDir() | yes | no | 消失 |
对于设备中每一个安装的 App,系统都会在内部存储空间的 data/data 目录下以应用包名为名字自动创建与之对应的文件夹。这个文件夹用于 App 中的 WebView 缓存页面信息,SharedPreferences 和 SQLiteDatabase 持久化应用相关数据等。
对于没有 Root 过的手机,普通用户是无法查看 data/data 目录内容的。不过开发人员可以使用模拟器调试应用,并通过 DDMS(Dalvik Debug Monitor Server)提供的 File Explorer 工具查看模拟器设备的存储空间。
当设备的内部存储空间不足时,Android 可能会删除Context.getCacheDir()
下的文件以回收空间。
当用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。
路径取得方法 | APP专用 | 非root用户可见 | APP卸载时 | |
---|---|---|---|---|
外部数据空间 | Context.getExternalFilesDir() | yes | yes | 消失 |
外部缓存空间 | Context.getExternalCacheDir() | yes | yes | 消失 |
考虑内部存储空间容量有限,普通用户不能直接直观地查看目录文件等其他原因,Android 在外部存储空间中也提供有特殊目录供应用存放私有文件,文件路径为:
/storage/emulated/0/Android/data/app包名目录
值得注意的是,与内部存储空间的应用私有目录不同的是:
默认情况下,系统并不会自动创建外部存储空间的应用私有目录。只有在应用需要的时候,开发人员通过 SDK 提供的 API 创建该目录文件夹和操作文件夹内容。
自 Android 7.0 开始,系统对应用私有目录的访问权限进一步限制。其他 App 无法通过 file:// 这种形式的 Uri 直接读写该目录下的文件内容,而是通过 FileProvider 访问。
系统媒体扫描程序不会读取这些目录中的文件,但是其他应用依然可以对该目录下的文件可以读写。
Context.getExternalCacheDir()
当内置存储的空间不足时将系统自动被清除
Android 4.4以后访问该目录不再需要权限了
而相同点在于:同属于应用私有目录,当用户卸载 App 时,系统也会自动删除外部存储空间下的对应 App 私有目录文件夹及其内容。
值得注意的一点是,对于外部存储空间下的应用私有目录文件,由于普通用户可以自由修改和删除,开发人员在使用时,一定要做好判空处理和异常捕获,防止应用崩溃退出!
路径取得方法 | APP专用 | 非root用户可见 | APP卸载时 | |
---|---|---|---|---|
外部公开空间 | Environment.getExternalStorageDirectory() | no | yes | 不消失 |
外部公开共享空间 | Environment.getExternalStoragePublicDirectory() | no | yes | 不消失 |
从访问权限上来说,应用无关数据应该是宿主应用希望与其他应用共享这些数据的,应该存放在外部存储空间的公共目录文件夹下。
外部存储空间已经为用户默认分类出一些公共目录。开发人员可以通过 Environment 类提供的方法直接获取相应目录的绝对路径,传递不同的 type 参数类型即可:
Environment.getExternalStoragePublicDirectory(String type);
Envinonment 类提供诸多 type 参数的常量,比如:
还可以在外部存储空间自由创建其他目录,通过这个方式获取外部存储空间的绝对路径,然后操作文件:
Environment.getExternalStorageDirectory();
有个小技巧,无论外部内部,只有路径中有包名,那么就是私有的,而且是随着程序的卸载而被删除的,有包名的路径均是Context中的方法,而公有的路径均是Environment调用的