最近开发一个系统管家类的项目,其中在坐垃圾清理的时候,首先需要获取垃圾文件的类型和大小等,其中,在应用程序这一部分,要求分类展示并清理应用程序的数据和缓存,所有首先需要得到系统中,所有的应用列表和数据及缓存大小。
---------------------------------start-----------------------------------
注意:我的源码环境是android4.4,“android.content.pm.PackageManager"中有一个"private"方法,
"getPackageSizeInfo",所以,用这个方法的时候,如果得不到,在检查权限没问题之后,检查一下你的API,看一下"PackageManager"中有没有这个方法!!!
首先:需要一个aidl文件,文件目录是固定的
aidl文件内容:
/* ** ** Copyright 2007, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ package android.content.pm; import android.content.pm.PackageStats; /** * API for package data change related callbacks from the Package Manager. * Some usage scenarios include deletion of cache directory, generate * statistics related to code, data, cache usage(TODO) * {@hide} */ oneway interface IPackageStatsObserver { void onGetStatsCompleted(in PackageStats pStats, boolean succeeded); }
aidl文件创建完成了之后,确定已经被build后,就可以使用了
然后,别忘了AndroidManifest权限:
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
之后就可以执行获取方法了:
//获取程序的应用大小、数据大小、缓存大小 public void getApkSize(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 { if (succeeded && pStats != null) { long codeSize = pStats.codeSize;//应用大小 long dataSize = pStats.dataSize;//数据大小 long cacheSize = pStats.cacheSize;//缓存大小 Log.e("David", "onGetStatsCompleted: long类型:\n 应用大小" + codeSize + "\n数据大小" + dataSize + "\n缓存大小" + cacheSize); //可转成string类型的数据 String codeStr = Formatter.formatFileSize(mContext, codeSize); Log.e("David", "onGetStatsCompleted: String类型:\n 应用大小" + Formatter.formatFileSize(mContext, codeSize) + "\n数据大小" + Formatter.formatFileSize(mContext, dataSize) + "\n缓存大小" + Formatter.formatFileSize(mContext, cacheSize)); } } }); }
日志:
E/David: onGetStatsCompleted: long类型:
应用大小123109376
数据大小27439104
缓存大小326078464
E/David: onGetStatsCompleted: String类型:
应用大小117 MB
数据大小26.17 MB
缓存大小311 MB
注意:在得到结果的位置,也就是本文方法中的log日志位置,不可直接返回结果,可以直接在此处理结果,或者通过Handler等回调结果
--------------------------------------end--------------------------------