存储图
路径地址
fun lookFilePath(view: View) {
//内部存储
val internalStoragePath = Environment.getDataDirectory().absolutePath// /data
val internalFilePath = filesDir.absolutePath // /data/user/0/com.zero.jiangke/files
val internalCachePath = cacheDir.absolutePath// /data/user/0/com.zero.jiangke/cache
//外部存储 公有目录
val externalStoragePath =
Environment.getExternalStorageDirectory().absolutePath// /storage/emulated/0
//外部私有目录
val externalFilePath =
getExternalFilesDir(Environment.DIRECTORY_DCIM)?.absolutePath// /storage/emulated/0/Android/data/com.zero.jiangke/files/DCIM
val externalCachePath =
externalCacheDir?.absolutePath// /storage/emulated/0/Android/data/com.zero.jiangke/cache
}
手机存储路径图
权限图
data/data 目录图
这个目录下不需要申请权限 SP也是存储在这个位置
内存划分图片
内部存储
用于存储Android系统本身和应用程序的存储区域
手机/system/目录
/data/等目录
其中data/data/
release 包 不能访问 data/data 目录 debug包可以
卸载后 data/包名 会被移除
//获取手机内部存储空间的绝对路径: /data/手机包名 Environment.getDataDirectory().getAbsolutePath();
data/data/packagename/files
context.getFilesDir().getAbsolutePath();
data/data/packagename/cache
context.getCacheDir().getAbsolutePath();
外部存储
/storage/emulated/0
//获取手机外部存储的路径: /storage/emulated/0 Environment.getExternalStorageDirectory().getAbsolutePath();
外部存储空间中的应用私有目录
同样的操作外部存储的私有目录不需要 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 权限
/storage/emulated/0/Android/data/packagename/files
获取某个应用在外部存储中的files路径
context.getExternalFilesDir(type).getAbsolutePath();
/storage/emulated/0/Android/data/packagename/cache
获取某个应用在外部存储中的cache路径
context.getExternalCacheDir().getAbsolutePath();
外部存储空间中的公共目录
例如相机被卸载后 相册里的图片还存在
需要申请 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 等权限
获取外部存储的根路径
Environment.getExternalStorageDirectory().getAbsolutePath()
获取外部存储的共享目录
Environment.getExternalStoragePublicDirectory(String type);
Environment 类提供诸多 type 参数的常量,比如:
Environment.DIRECTORY_DCIM : 数字相机拍摄的照片 Environment.DIRECTORY_MUSIC:用户音乐 Environment.DIRECTORY_PODCASTS:音频 / 视频的剪辑片段 Environment.DIRECTORY_RINGTONES:铃声 Environment.DIRECTORY_ALARMS:闹钟的声音 Environment.DIRECTORY_PICTURES:所有的图片 (不包括那些用照相机拍摄的照片) Environment.DIRECTORY_MOVIES:所有的电影 (不包括那些用摄像机拍摄的视频) 和 Download / 其他下载的内容。
Android10以后分区存储
目的为了 让 应用不能访问微信的 外部存储
Android 10以后只能通过 Uri访问
限制了应用程序对外部存储空间的操作权限 就算是通过申请READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限
也不能读写整个外部存储空间中的目录 应用程序只能访问外部存储中的公共媒体目录
Android10.0之前访问外部存储
通过File路径访问:File路径可以直接构造文件路径也可以通过MediaStore获取文件路径
通过Uri访问:Uri可以通过MediaStore或者SAF获取
Android10.0之后访问外部存储
Android10.0之后访问外部存储的公共目录中的媒体文件即/storage/emulated/0必须通过MediaStore或者Storage Access Framework(一下简称SAF)获取到Uri,然后通过Uri进行访问
非媒体文件只能通过SAF获取到Uri进行访问。App无法通过路径File(filePath)
小结
分区存储对内部存储或外部存储私有目录存储没有变更 变更的只是外部存储公有目录
内外存储API差异
外部存储通过Enviroment调用
内部存储通过Context调用
结论
Android10以下
A应用与B应用之间
给权限后 内部存储不能访问 (data/data) 外部存储可以访问(storage/emulated)
Android10 以上
A应用与B应用之间
只能访问媒体文件
不能访问内部存储共有目录