Android存储空间存储路径总结

一、总结

路径取得方法 APP专用 非root用户可见 APP卸载时
内部数据空间 Context.getFilesDir() yes no 消失
内部缓存空间 Context.getCacheDir() yes no 消失
外部数据空间 Context.getExternalFilesDir() yes yes 消失
外部缓存空间 Context.getExternalCacheDir() yes yes 消失
外部公开空间 Environment.getExternalStorageDirectory() no yes 不消失
外部公开共享空间 Environment.getExternalStoragePublicDirectory() 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/

1.内部存储空间中的应用私有目录

路径取得方法 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 工具查看模拟器设备的存储空间。

当用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。

2.外部存储空间中的应用私有目录

路径取得方法 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 访问。

而相同点在于:同属于应用私有目录,当用户卸载 App 时,系统也会自动删除外部存储空间下的对应 App 私有目录文件夹及其内容。

值得注意的一点是,对于外部存储空间下的应用私有目录文件,由于普通用户可以自由修改和删除,开发人员在使用时,一定要做好判空处理和异常捕获,防止应用崩溃退出!

3.外部存储空间中的公共目录

路径取得方法 APP专用 非root用户可见 APP卸载时
外部公开空间 Environment.getExternalStorageDirectory() no yes 不消失
外部公开共享空间 Environment.getExternalStoragePublicDirectory() no yes 不消失

从访问权限上来说,应用无关数据应该是宿主应用希望与其他应用共享这些数据的,应该存放在外部存储空间的公共目录文件夹下。

外部存储空间已经为用户默认分类出一些公共目录。开发人员可以通过 Environment 类提供的方法直接获取相应目录的绝对路径,传递不同的 type 参数类型即可:

Environment.getExternalStoragePublicDirectory(String type);

Envinonment 类提供诸多 type 参数的常量,比如:

  • DIRECTORY_MUSIC:/storage/emulated/0/Music
  • DIRECTORY_MOVIES:/storage/emulated/0/Movie
  • DIRECTORY_PICTURES:/storage/emulated/0/Pictures
  • DIRECTORY_DOWNLOADS: /storage/emulated/0/Download
  • DIRECTORY_DOCUMENTS: /storage/emulated/0/Documents

还可以在外部存储空间自由创建其他目录,通过这个方式获取外部存储空间的绝对路径,然后操作文件:

Environment.getExternalStorageDirectory();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章