Android 获取app应用大小、手机内存信息、删除文件方法、获得文件大小

因为最近在做清理缓存的功能所以需要用到这些方法,下面就直接贴出代码了。

获取手机信息:

	/**
	 * 获取手机内部剩余存储空间
	 *
	 * @return
	 */
	public static long getAvailableInternalMemorySize() {
		File path = Environment.getDataDirectory();
		StatFs stat = new StatFs(path.getPath());
		long blockSize = stat.getBlockSize();
		long availableBlocks = stat.getAvailableBlocks();
		return availableBlocks * blockSize;
	}

	/**
	 * 获取手机内部总的存储空间
	 *
	 * @return
	 */
	public static long getTotalInternalMemorySize() {
		File path = Environment.getDataDirectory();
		StatFs stat = new StatFs(path.getPath());
		long blockSize = stat.getBlockSize();
		long totalBlocks = stat.getBlockCount();
		return totalBlocks * blockSize;
	}
删除文件和读取文件大小

小技巧:

可以通过这个方法直接获得kb、MB、GB。系统会自动转化

Formatter.formatFileSize(context, size)


	/**
	 * 删除指定文件夹下的所有文件
	 * @param file
	 */
	public static void deleteFile(File file){
		if (file.isFile()) {
			file.delete();
			return;
		}
		if (file.isDirectory()) {
			File[] childFile = file.listFiles();
			if (childFile == null || childFile.length == 0) {
				file.delete();
				return;
			}
			for (File f : childFile) {
				deleteFile(f);
			}
			file.delete();
		}
//		if(file.exists()){
			file.delete();
//			Log.i("s","sss");
//		}
	}

	/**
	 * 获得文件大小
	 * @param file
	 * @return
	 * @throws Exception
	 */
	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;
	}

获取App所占大小稍微复杂一点:


目录结构为上图:

1、创建包:android.content.pm

2、创建两个AIDL文件IPackageStatsObserver.aidl 、PackageStats.aidl

IPackageStatsObserver.aidl

package android.content.pm;

import android.content.pm.PackageStats;

oneway interface IPackageStatsObserver {

    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
PackageStats.aidl
package android.content.pm;

parcelable PackageStats;

添加权限:

<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>

获得AppSize的方法为:

	/**
	 * 获得App应用的大小
	 * @param context
	 * @param pkgName
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 */
	public static void getPkgSize(final Context context, String pkgName) throws NoSuchMethodException,
			InvocationTargetException, IllegalAccessException {
		// getPackageSizeInfo是PackageManager中的一个private方法,所以需要通过反射的机制来调用
		Method method = PackageManager.class.getMethod("getPackageSizeInfo",
				String.class, IPackageStatsObserver.class);
		// 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
		method.invoke(context.getPackageManager(), pkgName,
				new IPackageStatsObserver.Stub() {
					@Override
					public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
						// 子线程中默认无法处理消息循环,自然也就不能显示Toast,所以需要手动Looper一下
						Looper.prepare();
						// 从pStats中提取各个所需数据
						Toast.makeText(context, "缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize) +
										"\n数据大小=" + Formatter.formatFileSize(context, pStats.dataSize) +
										"\n程序大小=" + Formatter.formatFileSize(context, pStats.codeSize),
								Toast.LENGTH_LONG).show();
						// 遍历一次消息队列,弹出Toast
						Looper.loop();
					}
				});
	}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值