前言

  本文大量借鉴一位大佬的博客解析Android内部存储、外部存储的区别   本文仅作为个人学习记录,如有错误,欢迎指正,非常感谢。
  Android项目开发必定使用到本地存储一些应用相关的数据,以及访问其他应用或者系统自带的公有共享文件(比如手机相册的图片)。所以对于内部存储和外部存储需要格外熟悉。

Android物理存储上目录的划分

  Android系统采用的Linux内核,所以数据存储的目录也和Linux系统相似,一般文件目录如下图所示:

Android文件存储数据 android文件存储详解_Android


1.内部存储:

  /data/data/ (黄线)是你应用安装的目录,是你应用的私有文件存储地方,其他应用以及用户是不可访问到的(要是有root当我没说),而应用本身可以轻松访问不需要任何权限。

  这个地方存放的可以是 SharedPreference、Sqlite等数据,如果用户卸载了应用,那么这些数据也会随之消失。

  这个地方存储的数据量不适宜过大,过大的数据应该存放在外部存储中。

  除了SharedPreference等,你也可以自己创建一个文件在这个目录中,方法为:(mode目前只能是 MODE_PRIVATE)

可创建并返回一个内部存储的文件
路径:/data/data/项目包名/
context.getDir(String name, String mode)
路径:/data/data/项目包名/files
context.getFileDir()
路径:/data/data/项目包名/cache
context.getCacheDir()
路径:/data/data/项目包名/
getApplicationInfo().dataDir

  如果你想和其他应用共享这个内部存储中的文件,可以使用FileProvider, 具体方法自行查找。

2.外部存储:
  就是存储在 安装目录之外的地方。
  主要由手机SD卡(这年头谁还用这个),以及部分手机内置存储卡(不可拆卸)构成;存储的数据主要为 手机本地公有共享文件(相册、视频、音频),应用本身私有的外部存储数据。
  应用私有外部存储目录属于应用私有,但这些私有数据是可以被其它应用访问和修改的。但这些数据却不能被系统的MediaStore库扫描到。
  MediaStore库是一个非常好用的系统库,能够轻松访问到系统本地相册,本地音乐的数据。有些流氓软件,某q音乐、某易云,某狗音乐,它们就是把用户下载的音乐放到应用外部存储的私有目录中,不让你保存到本地公有共享目录 ,这样,你只要卸载它的应用,这些数据就会跟着消失。
  应用除了可以对外部存储的私有目录操作,也可以对公有共享目录进行操作(比如用户在你的应用中长按保存图片,那么你可以把它存到公有目录中)
  (1)Android4.4以前需要添加以下权限才能对外部存储进行操作。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

  (2)Android4.4 - Android 6.0 不需要添加权限就能对外部存储的私有目录进行操作,对外部存储的公有目录还是、必须申请。
  (3)Android6.0以上,一些隐私权限需要动态申请,而且在用户同意授权之后App才能拥有该权限,巧的是对于外部存储的修改就在其中,嘿嘿。动态权限申请具体方式自行查找哈。
  (3)Android10以上,为了整顿Android存储乱象,Google重拳出击,从Android10开始,采用了分区存储机制, 应用只能访问自己的外部存储私有目录以及公共共享文件,而不能访问别的应用的外部存储私有目录。
  获取外部存储的方式:

路径: /storage/emulated/0/Android/data/包名/cache
context.getExternalCacheDir()
路径: /storage/emulated/0/Android/data/包名/files/Pictures图片
context.getExternalCacheDir(PICTURES)
路径: /storage/emulated/0/Android/data/包名/files/Pictures音乐
context.getExternalCacheDir(MUSIC)

3.分区存储机制:
推荐看一下Google官方文档:Android10 这个人写的也很不错:Android10适配