dashen的博客

失败是注定的,成功只是偶然

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();
					}
				});
	}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25412055/article/details/52371508
文章标签: android 缓存 存储
个人分类: android常见问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭