public class CleanMessageUtil {
/**
* @param context
* @return
* @throws Exception
* 获取当前缓存
*/
public static String getTotalCacheSize(Context context) throws Exception {
long cacheSize = getFolderSize(context.getCacheDir());
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
cacheSize += getFolderSize(context.getExternalCacheDir());
}
return getFormatSize(cacheSize);
}
//删除缓存
public static void clearAllCache(Context context) {
deleteDir(context.getCacheDir());
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
deleteDir(context.getExternalCacheDir());
}
}
private static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
return dir.delete();
}else if (dir == null || dir.isDirectory()) {
return true;
}
return dir.delete();
}
// 获取文件
// Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/
// 目录,一般放一些长时间保存的数据
// Context.getExternalCacheDir() -->
// SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
public static long getFolderSize(File file) throws Exception {
long size = 0;
try {
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
// 如果下面还有文件
if (fileList[i].isDirectory()) {
size = size + getFolderSize(fileList[i]);
} else {
size = size + fileList[i].length();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return size;
}
/**
* 格式化单位
*
* @param size
* @return
*/
public static String getFormatSize(double size) {
double kiloByte = size / 1024;
if (kiloByte < 1) {
// return size + "Byte";
return "0K";
}
double megaByte = kiloByte / 1024;
if (megaByte < 1) {
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
return result1.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "KB";
}
double gigaByte = megaByte / 1024;
if (gigaByte < 1) {
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
return result2.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "MB";
}
double teraBytes = gigaByte / 1024;
if (teraBytes < 1) {
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
.toPlainString() + "GB";
}
BigDecimal result4 = new BigDecimal(teraBytes);
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
+ "TB";
}
/** * 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) * * @param context */
public static void cleanInternalCache(Context context) {
deleteFilesByDirectory(context.getCacheDir());
}
/** * 清除本应用所有数据库(/data/data/com.xxx.xxx/databases) * * @param context */
public static void cleanDatabases(Context context) {
deleteFilesByDirectory(new File("/data/data/"
+ context.getPackageName() + "/databases"));
}
/**
* * 清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) * * @param
* context
*/
public static void cleanSharedPreference(Context context) {
deleteFilesByDirectory(new File("/data/data/"
+ context.getPackageName() + "/shared_prefs"));
}
/** * 按名字清除本应用数据库 * * @param context * @param dbName */
public static void cleanDatabaseByName(Context context, String dbName) {
context.deleteDatabase(dbName);
}
/** * 清除/data/data/com.xxx.xxx/files下的内容 * * @param context */
public static void cleanFiles(Context context) {
deleteFilesByDirectory(context.getFilesDir());
}
/**
* * 清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache) * * @param
* context
*/
public static void cleanExternalCache(Context context) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
deleteFilesByDirectory(context.getExternalCacheDir());
}
}
// /** * 清除自定义路径下的文件,使用需小心,请不要误删。而且只支持目录下的文件删除 * * @param filePath */
// public static void cleanCustomCache(String filePath) {
// deleteFilesByDirectory(new File(filePath));
// }
//
// /** * 清除本应用所有的数据 * * @param context * @param filepath */
// public static void cleanApplicationData(Context context, String...
// filepath) {
// cleanInternalCache(context);
// cleanExternalCache(context);
// cleanDatabases(context);
// cleanSharedPreference(context);
// cleanFiles(context);
// for (String filePath : filepath) {
// cleanCustomCache(filePath);
// }
// }
/** * 删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理 * * @param directory */
private static void deleteFilesByDirectory(File directory) {
if (directory != null && directory.exists() && directory.isDirectory()) {
for (File item : directory.listFiles()) {
item.delete();
}
}
}
}
获取Android应用专属缓存存储目录
如果你想摆脱缓存目录使用的尴尬:找不到目录?忘记申请读写权限?害怕污染用户存储空间?……请往下看
SD卡缓存目录
当应用需要将图片或者文件缓存到SD卡中时要去申请创建目录,有下面几种途径 我们可以通过API调用应用专属目录:
// /storage/emulated/0/Android/data/app_package_name/files/Pictures
Content.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
// /storage/emulated/0/Android/data/app_package_name/cache
Content.getExternalCacheDir();
- 1
- 2
- 3
- 4
上面两个目录是专属于当前app的,当应用被删除时,上面目录下的文件也会清空
内存缓存目录
相对于应用的专属SD卡缓存有两个内存缓存地址:
Content. getCacheDir(); // /data/data/app_package_name/cache
Content. getFilesDir(); // /data/data/app_package_name/files
- 1
- 2
这两个目录中的文件也会随着app的删除而清空
当系统版本大于等于4.4时,对通过上面4个API调用得到的目录进行文件的读写操作不需要申请SD卡的读写权限,所以6.0及以上系统使用时也不需要动态申请读写权限
使用注意事项
- 当存储比较大的文件时,如图片等文件存储在SD卡对应的目录下
- 应用的内存缓存目录只有应用本身能对其进行读写操作,外部应用不行,如相机应用 (内存目录读写权限:rwxr-x–x,SD卡缓存目录读写权限:rwxrwx—)
- 即使是通过自定义路径得到的上述目录,在系统版本大于等于4.4时也不需要申请SD卡读写权限
API使用及方法封装
/**
* 获取应用专属缓存目录
* android 4.4及以上系统不需要申请SD卡读写权限
* 因此也不用考虑6.0系统动态申请SD卡读写权限问题,切随应用被卸载后自动清空 不会污染用户存储空间
* @param context 上下文
* @param type 文件夹类型 可以为空,为空则返回API得到的一级目录
* @return 缓存文件夹 如果没有SD卡或SD卡有问题则返回内存缓存目录,否则优先返回SD卡缓存目录
*/
public static File getCacheDirectory(Context context,String type) {
File appCacheDir = getExternalCacheDirectory(context,type);
if (appCacheDir == null){
appCacheDir = getInternalCacheDirectory(context,type);
}
if (appCacheDir == null){
Log.e("getCacheDirectory","getCacheDirectory fail ,the reason is mobile phone unknown exception !");
}else {
if (!appCacheDir.exists()&&!appCacheDir.mkdirs()){
Log.e("getCacheDirectory","getCacheDirectory fail ,the reason is make directory fail !");
}
}
return appCacheDir;
}
/**
* 获取SD卡缓存目录
* @param context 上下文
* @param type 文件夹类型 如果为空则返回 /storage/emulated/0/Android/data/app_package_name/cache
* 否则返回对应类型的文件夹如Environment.DIRECTORY_PICTURES 对应的文件夹为 .../data/app_package_name/files/Pictures
* {@link android.os.Environment#DIRECTORY_MUSIC},
* {@link android.os.Environment#DIRECTORY_PODCASTS},
* {@link android.os.Environment#DIRECTORY_RINGTONES},
* {@link android.os.Environment#DIRECTORY_ALARMS},
* {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
* {@link android.os.Environment#DIRECTORY_PICTURES}, or
* {@link android.os.Environment#DIRECTORY_MOVIES}.or 自定义文件夹名称
* @return 缓存目录文件夹 或 null(无SD卡或SD卡挂载失败)
*/
public static File getExternalCacheDirectory(Context context,String type) {
File appCacheDir = null;
if( Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
if (TextUtils.isEmpty(type)){
appCacheDir = context.getExternalCacheDir();
}else {
appCacheDir = context.getExternalFilesDir(type);
}
if (appCacheDir == null){// 有些手机需要通过自定义目录
appCacheDir = new File(Environment.getExternalStorageDirectory(),"Android/data/"+context.getPackageName()+"/cache/"+type);
}
if (appCacheDir == null){
Log.e("getExternalDirectory","getExternalDirectory fail ,the reason is sdCard unknown exception !");
}else {
if (!appCacheDir.exists()&&!appCacheDir.mkdirs()){
Log.e("getExternalDirectory","getExternalDirectory fail ,the reason is make directory fail !");
}
}
}else {
Log.e("getExternalDirectory","getExternalDirectory fail ,the reason is sdCard nonexistence or sdCard mount fail !");
}
return appCacheDir;
}
/**
* 获取内存缓存目录
* @param type 子目录,可以为空,为空直接返回一级目录
* @return 缓存目录文件夹 或 null(创建目录文件失败)
* 注:该方法获取的目录是能供当前应用自己使用,外部应用没有读写权限,如 系统相机应用
*/
public static File getInternalCacheDirectory(Context context,String type) {
File appCacheDir = null;
if (TextUtils.isEmpty(type)){
appCacheDir = context.getCacheDir();// /data/data/app_package_name/cache
}else {
appCacheDir = new File(context.getFilesDir(),type);// /data/data/app_package_name/files/type
}
if (!appCacheDir.exists()&&!appCacheDir.mkdirs()){
Log.e("getInternalDirectory","getInternalDirectory fail ,the reason is make directory fail !");
}
return appCacheDir;
}