Android 文件存储位置梳理

      所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。

      在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。

     外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。

     从逻辑意义上来说,data 目录就是就是就是手机的内部存储,而 mnt 或者 storage 目录下的sdcard目录就是外部存储。如果是手机内存的外部存储被称为机身外部存储,外置的SD卡则称之为外部存储。

Android下有哪些文件目录

在Android系统中,根据调用的系统API接口,有3种目录可以给我们写入文件:

一,应用私有存储(内部存储)

   1,获取方式:

   Context.getFileDir():获取内置存储下的文件目录,可以用来保存不能公开给其他应用的一些敏感数据如用户个人信息。

   Context.getCacheDir():获取内置存储下的缓存目录,可以用来保存一些缓存文件如图片,当内置存储的空间不足时将系统自动被清除。

   2,绝对路径:

    Context.getFileDir():/data/data/应用包名/files/[6.0以下]

                       /data/user/0/应用包名/files/[6.0以上]=[Cocos2dx下的getWritablePath()]

    Context.getCacheDir():/data/data/应用包名/cache/[6.0以下]

                    /data/user/0/应用包名/cache/[6.0以上]

  3,写权限:不需要申请。

    这是手机的内置存储,没有root的过的手机是无法用文件管理器之类的工具查看的。而且这些数据也会随着用户卸载App而被一起删除。这两个目录其实就对应着设置->应用->你的App->存储空间下面的清除数据清楚缓存,如下图所示。

  

二,应用扩展存储(内置的外部存储)

    1,获取方式:

        Context.getExternalFilesDir()获取内置外部存储上的文件目录。

        Context.getExternalCacheDir()获取内置外部存储上的缓存目录。

     2,绝对路径:

        Context.getExternalFilesDir()SDCard/Android/data/应用包名/files/

        Context.getExternalCacheDir()SDCard/Android/data/应用包名/cache/

      3,写权限:API < 19:需要申请;API >= 19:不需要申请。

           "android.permission.WRITE_EXTERNAL_STORAGE";

           "android.permission.READ_EXTERNAL_STORAGE"

           Also starting in API level 19, this permission is not required to read/write files in your application-specific directories returned by getExternalFilesDir(String) and getExternalCacheDir().

          Android 6.0以后系统,就不再需要用户授权了。

      同上面一样的,这里的文件会随着App卸载而被删除,也可以由用户手动在设置界面里面清除。既然是SD卡上的目录,那么是可以被其他的应用读取到的,所以这个目录下,不应该存放用户的敏感信息。

     清除缓存:删除缓存数据,即getCacheDir()与getExternalCacheDir()。
     清除数据:删除所有数据,即getFilesDir()、getCacheDir()、getExternalFilesDir(null)、getExternalCacheDir()。
 

三,公共存储(SD卡外部存储)

     1,获取方式:

        Environment.getExternalStorageDirectory()

     2,绝对路径:SDCard/你设置的文件夹名字/

     3,写权限:需要申请。

     如果我们的App需要存储一些公共的文件,甚至希望下载下来的文件即使在我们的App被删除之后,还可以被其他App使用,那么就可以使用这个目录。这个目录是始终需要申请SD写入权限的。

 

 

感谢原作者的辛勤劳作:

   https://www.cnblogs.com/slyfox/p/9584388.html

   http://unclechen.github.io/2016/03/06/Android6.0权限适配之SD卡写入/

   https://blog.csdn.net/ruancoder/article/details/54290807