一、前言:
Android 中获取本地储存路径,有四个方法,
getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()。
接下来介绍下每个方法的特点以及路径地址
- getCacheDir():/data/data/你的应用的包名/cache
- getFilesDir():/data/data/你的应用的包名/files
- getExternalFilesDir():SDCard/Android/data/你的应用的包名/files/
- getExternalCacheDir():SDCard/Android/data/你的应用包名/cache/
- 从上文每个方法获取的路径中可以看出,getCacheDir()和getFilesDir()是获取手机自带的存储空间中的当前包文件的路径 ;
- getExternalFilesDir()和getExternalCacheDir()是获取手机中SD卡的存储控件中的当前包文件的路径。
使用外部存储记得加上访问权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
二、路径解析:
1. getCacheDir()
该目录主要用于存放缓存文件,当系统的内存存储空间紧张时,该目录下的文件会被删除掉。关于这些文件究竟会在存储空间剩余多少的情况,没有严格的标准保障。
注意:你不应该依赖系统来清理这些缓存文件,你应该对这些缓存文件占用的最大存储空间设定个最大值,比如是1M,当实际占用空间超过这个值时,你应该对这些缓存文件做相应的清理工作(prune)。
返回的路径可能会改变随着时间的推移,所以应该保存相对路径相对路径。
2. getFilesDir()
- openFileOutput() 方法存储的路径,跟getFilesDir() 返回的路径是同一个路径,换句话说:getFilesDir(),是获取openFileOutput() 方法的存储路径。
返回的路径可能会改变随着时间的推移,所以应该保存相对路径相对路径 - 不需要任何权限也可以访问
目录中的文件,会在卸载你的应用程序时被删除掉
3. getExternalFilesDir()
存储在SD卡中,和getFilesDir()类似;
该方法路径下系统不一定会自动删除文件,所以需要手动设置使用的大小
getExternalFilesDir()路径不一定可用,因为,sd卡可能被卸载
4. getExternalCacheDir()
存储在SD卡中,和getCacheDir类似;
该方法路径下系统不一定会自动删除文件,所以需要手动设置使用的大小
getExternalCacheDir()路径不一定可用,因为,sd卡可能被卸载
public String getDiskCacheDir(Context context) {
String cachePath = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
return cachePath;
}
三、代码解析:
1. 手机应用内置存储路径
- getFilesDir().getAbsolutePath()
- getFilesDir().getPath()
- getCacheDir().getAbsolutePath()
- getCacheDir().getPath()
实验代码:
String savePath5 = getFilesDir().getAbsolutePath();
String savePath6 = getFilesDir().getPath();
String savePath7 = getCacheDir().getAbsolutePath();
String savePath8 = getCacheDir().getPath();
Log.d(TAG,"save path5 --------->"+savePath5);
Log.d(TAG,"save path6 --------->"+savePath6);
Log.d(TAG,"save path7 --------->"+savePath7);
Log.d(TAG,"save path8 --------->"+savePath8);
打印结果:
tag:save path5 --------->/data/user/0/fxjzzyo.com.ffmpegtest/files
tag:save path6 --------->/data/user/0/fxjzzyo.com.ffmpegtest/files
tag: save path7 --------->/data/user/0/fxjzzyo.com.ffmpegtest/cache
tag: save path8 --------->/data/user/0/fxjzzyo.com.ffmpegtest/cache
结论:
- getFilesDir()返回的是/data/user/0/包名/files这个文件夹,与应用的存在有关,当应用卸载时,里面的内容也同时被删除。
- 同理,getCacheDir()返回的是/data/user/0/包名/cache这个文件夹,与应用的存在有关,当应用卸载时,里面的内容也同时被删除。
- 另外,我这里的实验结果getAbsolutePath()和getPath()返回的路径是一样的,所以使用时不必纠结,我打算以后就用绝对路径getAbsolutePath()好了。
2. 手机外置sd卡存储路径(已过时,在AndroidX会报错)
有两种获取方式,一种是获取到sd卡根目录,另一种是获取到应用相关的sd卡目录。
2.1 获取sd卡根目录路径(已过时,在AndroidX会报错)
Environment.getExternalStorageDirectory().getAbsolutePath()
实验代码:
String savePath9 = Environment.getExternalStorageDirectory().getAbsolutePath();
String savePath10 = Environment.getExternalStorageDirectory().getPath();
Log.d(TAG,"save path9 --------->"+savePath9);
Log.d(TAG,"save path10 --------->"+savePath10);
打印结果:
tag: save path9 --------->/storage/emulated/0
tag: save path10 --------->/storage/emulated/0
结论:
Environment.getExternalStorageDirectory()获取的是sd卡的根目录文件夹,与应用无关,即使卸载了应用,里面的内容依然存在。
2.2 获取到应用相关的sd卡目录路径(已过时,在AndroidX会报错)
- getExternalFilesDir(null).getAbsolutePath()
实验代码:
String savePath = getExternalFilesDir(null).getAbsolutePath();
String savePath2 = getExternalFilesDir(null).getPath();
String savePath3 = getExternalCacheDir().getAbsolutePath();
String savePath4 = getExternalCacheDir().getPath();
Log.d(TAG,"save path --------->"+savePath);
Log.d(TAG,"save path2 --------->"+savePath2);
Log.d(TAG,"save path3 --------->"+savePath3);
Log.d(TAG,"save path4 --------->"+savePath4);
打印结果:
tag: save path --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/files
tag: save path2 --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/files
tag: save path3 --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/cache
tag: save path4 --------->/storage/emulated/0/Android/data/fxjzzyo.com.ffmpegtest/cache
结论:
- getExternalFilesDir(null)获取的是/storage/emulated/0/Android/data/包名/files这个文件夹,与应用有关,卸载了应用,里面的内容也没了。
- 同理,getExternalCacheDir()获取的是/storage/emulated/0/Android/data/包名/cache这个文件夹,与应用有关,卸载了应用,里面的内容也没了。
四、使用Android公共路径
//已经废弃,AndroidX会报错
String APP_ROOT_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ "/" + BaseApplication.instance.getPackageName();
//使用这个
String absolutePath = BaseApplication.instance.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
//传入值为空
String path2 = BaseApplication.instance.getExternalFilesDir(null).getAbsolutePath();
Log.d("LUO","===APP_ROOT_PATH: "+APP_ROOT_PATH);
Log.d("LUO","===absolutePath: "+absolutePath);
Log.d("LUO","===path2: "+path2);
LUO: ===APP_ROOT_PATH: /storage/emulated/0/Download/com.dotc.demo1
LUO: ===absolutePath: /storage/emulated/0/Android/data/com.dotc.demo1/files/Download
LUO: ===path2: /storage/emulated/0/Android/data/com.dotc.demo1/files
五、获取APP路径
1、getExternalFilesDir()和getFilesDir()
public String getFilesPath( Context context ){
String filePath ;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
//外部存储可用
filePath = context.getExternalFilesDir(null).getPath();
}else {
//外部存储不可用
filePath = context.getFilesDir().getPath() ;
}
return filePath ;
}
函数返回路径/storage/emulated/0/Android/data/包名/files
用来存储一些长时间保留的数据,应用卸载会被删除
2、getExternalCacheDir和getCacheDir
public String getCachePath( Context context ){
String cachePath ;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
//外部存储可用
cachePath = context.getExternalCacheDir().getPath() ;
}else {
//外部存储不可用
cachePath = context.getCacheDir().getPath() ;
}
return cachePath ;
}
函数返回路径/storage/emulated/0/Android/data/包名/cache
用来存储一些临时缓存数据
参考文章:
https://blog.csdn.net/xiao_sier/article/details/78667149