所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。
在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。
外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。
从逻辑意义上来说,data
目录就是就是就是手机的内部存储,而 mnt
或者 storage
目录下的sdcard
目录就是外部存储。如果是手机内存的外部存储被称为机身外部存储,外置的SD卡则称之为外部存储。
在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