Android中的存储路径


存储数据的几种方式

  • 应用专属存储空间

    应用专属空间里的数据会在应用被卸载的时候删除,清除缓存通常指的是清除缓存文件下的文件,清空数据则是清空所有cache,files下文件,如果想让其他APP可以访问这些私有数据,可以利用FileProvider。

    • 内部存储

      大多是通过Context获取的地址,一般在/data/data文件夹下,如

      • dataDir: /data/data/packagename
      • filesDir: /data/data/packagename/files
      • cacheDir: /data/data/packagename/cache
      • codeCacheDir:/data/data/packagename/code_cache
    • 外部存储

      可以通过Context获取,也可以通过Environment获取,一般在/storage/emulated/0/Android/data/pacakagename/,如:

      • externalCacheDir:/storage/emulated/0/Android/data/pacakagename/cache
      • getExternalFilesDir:/storage/emulated/0/Android/data/pacakagename/files
      • externalMediaDirs
    • SharedPreference

    • 本地数据库

  • 共享的存储空间

    可以被其他APP访问的数据,app卸载不会被删除,通常位于/storage/emulated/0下(除了/storage/emulated/0/Android/data/pacakagename)。

    • media files

      可以通过 MediaStore处理

    • 文档和其他文件

      可以通过ContentResolver和其他相关方法处理

几个容易混淆的地方

/data/data vs /data/user/0

/Android/data vs /Android/user/0

现在的手机操作系统多是支持多用户的,最常见的就是“访客模式”,通常情况下,/data/data 与 /data/user/0是等价的,对于不同的用户,实际的存储位置可能是/user/xxx,但是我们通常只需要访问/data/data即可。

/mnt/sdcard vs /sdcard vs /storage/sdcard0

这个其实就是“软链接”的区别,可以通过 ls -l命令查看:

storage/sdcard0 -> /sdcard
mnt/sdcard -> /storage/self/primary
sdcard -> /storage/self/primary

可以看到这几个地址的真实地址实际上都是/storage/self/primary。

/storage/emulated/0

共享的存储空间的根目录,其中0代表的是主存,如果有移动的存储空间,如外接SD卡,则会有其他数字。

可通过下列方法获取:

Environment.getExternalStorageDirectory()

在Android Q之后,这个方法标记废弃,可以使用

Context#getExternalFilesDir(String)

或者MediaStoreIntent#ACTION_OPEN_DOCUMENT等方法作为替代。

该目录下在没有被app污染时,通常有以下这些子目录:

Alarms Android DCIM Download Movies Music Notifications Pictures Podcasts Ringtones

对于具体的子目录,可以通过以下方法获取:

Environment.getExternalStoragePublicDirectory

Android Q之后,可用上面说的Context#getExternalFilesDir(String)MediaStoreIntent#ACTION_OPEN_DOCUMENT替代。


文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
 上一篇
Golang中的init方法 Golang中的init方法
init方法是什么我们都知道程序的入口在main包下的main()方法,其实还有一个方法会在main方法之前执行,这个方法就是init() init()方法用于package级别的一些初始化操作. 主要特点 init先于main自动执行,不
2020-05-08
下一篇 
初识SDL 初识SDL
SDL是什么Simple DirectMedia Layer 是一个跨平台的开发库,它提供了对音频,键盘,鼠标,游戏手柄的底层访问接口.以及通过OpenGL或者Direct3D控制图形硬件的接口. 目前支持以下平台: Windows
2020-05-08
  目录