Android 获取应用缓存大小与清除缓存的方法

如下所示:

package com.lucasey.littleant.frame;

/**
 * 文 件 名: FileCacheUtils.java
 * 描 述: 主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录
 * */ 

import java.io.File;
import java.math.BigDecimal; 

import android.content.Context;
import android.os.Environment;
import android.text.TextUtils; 

/** 本应用数据清除管理器 */
public class FileCacheUtils {
 /**
 * * 清除本应用内部缓存(/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);
 if (filepath == null) {
  return;
 }
 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();
  }
 }
 } 

 // 获取文件
 //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 deleteThisPath
 * @param filepath
 * @return
 */
 public static void deleteFolderFile(String filePath, boolean deleteThisPath) {
 if (!TextUtils.isEmpty(filePath)) {
  try {
  File file = new File(filePath);
  if (file.isDirectory()) {// 如果下面还有文件
   File files[] = file.listFiles();
   for (int i = 0; i < files.length; i++) {
   deleteFolderFile(files[i].getAbsolutePath(), true);
   }
  }
  if (deleteThisPath) {
   if (!file.isDirectory()) {// 如果是文件,删除
   file.delete();
   } else {// 目录
   if (file.listFiles().length == 0) {// 目录下没有文件或者目录,删除
    file.delete();
   }
   }
  }
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }
 } 

 /**
 * 格式化单位
 * @param size
 * @return
 */
 public static String getFormatSize(double size) {
 double kiloByte = size / 1024;
 if (kiloByte < 1) {
  return size + "Byte";
 } 

 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";
 } 

 /***
 * 获取应用缓存大小
 * @param file
 * @return
 * @throws Exception
 */
 public static String getCacheSize(File file) throws Exception {
 return getFormatSize(getFolderSize(file));
 } 

} 

以上这篇Android 获取应用缓存大小与清除缓存的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2018-08-05

Android获取应用程序大小和缓存的实例代码

info package com.qin.appsize; import android.content.Intent; import android.graphics.drawable.Drawable; //Model类 ,用来存储应用程序信息 public class AppInfo { private String appLabel; //应用程序标签 private Drawable appIcon ; //应用程序图像 private Intent intent ; //启动应用程序

Android实现离线缓存的方法

离线缓存就是在网络畅通的情况下将从服务器收到的数据保存到本地,当网络断开之后直接读取本地文件中的数据.如Json 数据缓存到本地,在断网的状态下启动APP时读取本地缓存数据显示在界面上,常用的APP(网易新闻.知乎等等)都是支持离线缓存的,这样带来了更好的用户体验. 如果能够在调用网络接口后自动缓存返回的Json数据,下次在断网状态下调用这个接口获取到缓存的Json数据的话,那该多好呢?Volley做到了这一点. 因此,今天这篇文章介绍的就是使用Volley自带的数据缓存,配合Universal

Android中Glide获取缓存大小并清除缓存图片

清除Glide缓存 Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMemory();(清除内存缓存)两个方法.其中clearDiskCache()方法必须运行在子线程,clearMemory()方法必须运行在主线程,这是这两个方法所强制要求的,详见源码. 获取Glide缓存空间大小 这个网上也有过一些介绍,但是给出的实现代码存在一些问题,我这里做了一定的修改.一下方法

Android获取应用程序大小的方法

今天碰到个问题,想获取某个已安装的包的大小,没找到合适的方法.搜索了一下,发现PackageManager里面有个getPackageSizeInfo方法,可惜是hide的,而且它执行之后,会将结果回调给IPackageStatsObserver的onGetStatsCompleted方法.后来想直接计算/data/app和/system/app里面的apk大小,可是有时候会碰到权限问题,需要root才可以获取大小.        再后来,我想起系统的设置里面有一个应用程序管理,它里面列出了所有

Android 8.0的缓存大小和缓存清理接口方法

获取缓存大小接口 主要这里的方法已经和7.0不兼容了. import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Process; import android.os.storage.StorageManager

Android 7.0系统webview 显示https页面空白处理方法

最近开发的时候,偶尔遇到在线上稳定运行的webview内嵌的h5页面加载不出来,一直定位不到具体原因(因为我们自己做的兼容性测试上不重现),看系统日志也没有发现什么问题,后来咨询了用户手机的型号,发现是7.0或者6.0以上的个别机型会出现. 后来借到了一台业务的手机,型号是:三星 S6 EDGE,SM-G9205,在大多数机型上运行正常的页面,在这个机器上如下图: 这个页面在近期的变更是从http切换到https,由于之前的页面是http,我们在切换的时候,除了url之外,并未对webview的

Android 5.0及以上编程实现屏幕截图功能的方法

本文实例讲述了Android 5.0及以上编程实现屏幕截图功能的方法.分享给大家供大家参考,具体如下: 在Android 5.0,API 21 之前想要截图系统屏幕必须Root才能完成,5.0之后开放了接口,下面看我们是怎么实现的. 一. 涉及到的相关类 1. MediaProjectionManager 官方原话: Manages the retrieval of certain types of {@link MediaProjection} tokens. 这个类通过 Context#ge

Android Studio3.0升级后使用注意事项及解决方法

Gradle plugin最高版本4.* 老的项目在使用新版本时,可能会出现gradle plugin冲突的问题 Error:Failed to open zip file. Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) Re-download dependencies and sync project (requires network)

Android 8.0版本更新无法自动安装问题的解决方法

前言 前几天APP上线了个新版本,有部分用户反应在下载完安装包以后点击安装无反应.查了下这部分用户手机的系统的版本都是8.0+版本.因为太久没关注新版本特性,所以导致了这个问题的发生. Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他无关应用.在应用权限设置的"特殊访问权限"中,加入了"安装其他应用"的设置. 实现 1.清单文件权限声明 <uses-permissionandroid:name="android.pe

Android 8.0中一些坑以及对应的解决方法

前言 虽然 Android 9.0 都已经面世了,本篇文章写的有点迟了. 但是迟到好过不到,因此基于此这边还是记录一下项目中遇到的 Android 8.0 的坑及对应解决方法. 每次系统升级,虽然系统功能更加强大了,各方面性能也提高了. 但是对于开发者而言,一个困扰的问题也是随之而来--兼容. 尤其对于一些已经上市的 App 而言,在新系统发布之前就要了解到底有哪些改动,以避免用户升级新系统后导致 App 没法正常运行. 好了,回归主题,说说 Android 8.0 里面的几个坑吧. 唤不起系统

Android 8.0不能自动安装APK问题的解决方法(完美适配)

Android8.0之前 未知应用安装权限默认开启,如下图所示 8.0以下手机未知应用安装权限.png Android8.0之后 未知应用安装权限默认关闭,且权限入口隐藏. 如何开启未知应用安装权限的入口,并设置允许安装? 在清单文件中添加权限 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> 判断当前是否为8.0以上系统(在这之前也可以对7.0系统进行判断,这里代码没

Android 6.0指纹识别App开发案例

在android 6.0中google终于给android系统加上了指纹识别的支持,这个功能在iPhone上早就已经实现了,并且在很多厂商的定制的ROM中也都自己内部实现这个功能了,这个功能来的有点晚啊.在google全新发布的nexus设备:nexus 5x和nexus 6p中都携带了一颗指纹识别芯片在设备的背面,如下图(图片来自网络): 笔者手中的设备就是图上的那台黑色的nexus 5x,话说这台机器很是好看呢!手感超棒! 废话不多说,下面我出一个指纹识别的demo app,并且详细说明怎么