首先,明确一个概念,Android内部存储和外部存储并不是所谓的手机自带内存是内部存储,SD卡是外部存储云云。
Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的。
一、概念
内部存储是指系统内部存储空间,在逻辑上用目录来区分的话就是data目录下的文件夹
除此之外data目录下有app目录存放系统下载的apk信息,有data目录存放各种文件
例如:
sharedPreferenced存储的文件在 /data/data//shared_prefs/目录下。
Sqlite存储的文件在 /data/data//database/目录下。
外部存储就简单多了
1、手机厂商自带存储,也就是常说的 16GB、64GB等
2、SD卡
这些都是外部存储
二、获取可操作内部存储目录(随着用户删除app而删除)
getCacheDir().getPath():内部缓存目录
/data/user/0/packname/cache/ //7.0以上
/data/data/packname/cache/
getFilesDir().getPath():内部文件目录
/data/user/0/packname/files/
/data/data/packname/files/
shared_prefs和database两个文件夹有sharedPreferenced和Sqlite这些专门工具去操作。
注:data/data/…和data/user/0/… 区别是后者区分用户,不过这不重要
三、获取可操作外部存储目录
外部存储分为外部公共目录、外部私有目录、缓存目录:
1、外部九大公共目录:
Environment.getExternalStoragePublicDirectory(context,type);
/storage/emulate/0/....
有九种type,分别对应不同的目录,如下
DIRECTORY_MUSIC:音乐类型 /storage/emulate/0/music
DIRECTORY_PICTURES:图片类型
DIRECTORY_MOVIES:电影类型
DIRECTORY_DCIM:照片类型,相机拍摄的照片视频都在这个目录(digital camera in memory)
DIRECTORY_DOWNLOADS:下载文件类型 /storage/emulate/0/downloads
DIRECTORY_DOCUMENTS:文档类型
DIRECTORY_RINGTONES:铃声类型
DIRECTORY_ALARMS:闹钟提示音类型
DIRECTORY_NOTIFICATIONS:通知提示音类型
2、外部私有目录 (随着用户删除app而删除)
getExternalFilesDir(type)
/storage/emulated/0/Android/data/packagename/files/
3、外部缓存目录(随着用户删除app而删除)
getExternalCacheDir()
/storage/emulated/0/Android/data/packname/cache/
4、外部根目录
Environment.getExternalStorageDirectory()
/storage/emulated/0
路径 | 方法名 | 所属 |
---|---|---|
/data/data/<包名>/files | getFilesDir() | 内部 |
/data/data/<包名>/cache | getCacheDir() | 内部 |
/data/data/<包名>/app_ | getDir() | 内部 |
/storage/emulated/0 | Environment.getExternalStorageDirectory() | 外部根目录 |
/storage/emulated/0/ | Environment.getExternalStoragePublicDirectory(type) | 外部九大公有目录 |
/storage/emulated/0/Android/data/<包名>/files/ | getExternalFilesDir(type) | 外部私有目录 |
/storage/emulated/0/Android/data/<包名>/cache | getExternalCacheDir() | 外部缓存目录 |
注:无论外部内部,只要路径中有包名,就是私有的,用户需要root才能访问。获取路径的方法均是Context调用的,且随着用户删除app而销毁,没有包名的路径均是Environment调用的。
注:
FileProvider的paths与对应目录解析:
root-path 对应DEVICE_ROOT,也就是File DEVICE_ROOT = new File("/"),即根目录,一般不需要配置。
files-path对应 getFilesDir() 获取到的内部文件目录。
cache-path对应 getCacheDir() 获取到的内部缓存目录。
external-path对应 Environment.getExternalStorageDirectory() 指向的外部根目录。
external-files-path对应 ContextCompat.getExternalFilesDirs() 获取到的外部私有目录。
external-cache-path对应 ContextCompat.getExternalCacheDirs() 获取到的外部缓存目录。