内部存储位于系统中很特殊的一个位置,对于设备中每一个安装的 App,系统都会在
data/data/packagename/xxx
自动创建与之对应的文件夹
Android可以说是一个Linux操作系统,它的内部存储空间对于应用程序和用户来讲就是“
/data/data
“目录。内部存储与外部存储相比有着比较稳定,存储方便,操作简单,更加安全(可以控制访问权限)等优点,而它唯一的缺点就是空间有限。
|
|
对于内部存储路径,我们一般通过以下两种方式获取,内部存储空间的获取都需要使用Context:
context.getFileDir()
对应内部存储的路径为:
data/data/packagename/files,但是对于有的手机如:华为,小米等获取到的路径为:
data/user/0/packagename/files
context.getCacheDir()
对应内部存储的路径为:
data/data/packagename/cache,但是对于有的手机如:华为,小米等获取到的路径为:
data/user/0/packagename/cache
|
|
|
getExternalCacheDir()
对应外部存储路径:/storage/emulated/0/Android/data/packagename/cache
getExternalFilesDir(String type)
对应外部存储路径:/storage/emulated/0/Android/data/packagename/files
其他:
1、Environment.
getDataDirectory() = /data
这个方法是获取内部存储的根路径
2、
getFilesDir().getAbsolutePath()
= /data/user/0/packname/files
这个方法是获取某个应用在内部存储中的files路径
3、
getCacheDir().getAbsolutePath()
= /data/user/0/packname/cache
这个方法是获取某个应用在内部存储中的cache路径
4、
getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()
= /data/user/0/packname/app_myFile
这个方法是获取某个应用在内部存储中的自定义路径
5、Environment.
getExternalStorageDirectory().getAbsolutePath()
= /storage/emulated/0
这个方法是获取外部存储的根路径
6、Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM)
= /storage/emulated/0
这个方法是获取外部存储公有目录
7、
getExternalFilesDir(“”).getAbsolutePath()
= /storage/emulated/0/Android/data/packname/files
这个方法是获取某个应用在外部存储中的files路径
8、
getExternalCacheDir().getAbsolutePath()
= /storage/emulated/0/Android/data/packname/cache
这个方法是获取某个应用在外部存储中的cache路径
|
因为外部存储不一定可用,所以返回值可为空或空数组
|
File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
for(File file:files){
Log.e("main",file);
}
}
|
结果:
/storage/emulated/0/Android/data/packname/files/mounted
/storage/B3E4-1711/Android/data/packname/files/mounted
|
public static String getFilePath(Context context,String dir) {
String directoryPath="";
if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判断外部存储是否可用
directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
}else{//没外部存储就使用内部存储
directoryPath=context.getFilesDir()+File.separator+dir;
}
File file = new File(directoryPath);
if(!file.exists()){//判断文件目录是否存在
file.mkdirs();
}
return directoryPath;
}
|
//检测是否可用:
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;/* 检查外部存储是否可读写 */void updateExternalStorageState() {
String state = Environment.
getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// 可读写
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// 可读
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
mExternalStorageAvailable = mExternalStorageWriteable = false;
}}
或者:
String externalStorageState = Environment.getExternalStorageState();
if (externalStorageState.equals(Environment.MEDIA_MOUNTED)){
//sd卡已经安装,可以进行相关文件操作
}
|
//监听外部存储状态
BroadcastReceiver mExternalStorageReceiver;/* 开始监听 */void startWatchingExternalStorage() {
mExternalStorageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 更新状态
updateExternalStorageState();
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
// 动态注册广播接收器
registerReceiver(mExternalStorageReceiver, filter);
updateExternalStorageState();}/* 停止监听 */void stopWatchingExternalStorage() {
// 注销广播接收器
unregisterReceiver(mExternalStorageReceiver);}
|
/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系