一、查询手机所有已安装的应用
可以通过 PackageManager
来获取,可以使用
PackageManager pm = context.getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(0);
//或者
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = pm.queryIntentActivities(intent,0);
遍历即可获取所有应用的包名,图标、版本等等信息,但不包括应用大小,如代码、数据、缓存信息。
二、 在 Android O 之前版本
获取应用本身大小可以通过 PackageManager
的隐藏函数 getPackageSizeInfo(String packageName, IPackageStatsObserver observer)
,利用反射来获取,简单示例代码如下,注意获取是通过AIDL进行,所以需要在工程中创建 IPackageStatsObserver.aidl
和 PackageStats.aidl
文件
PackageManager pm = context.getPackageManager();
Method method = null;
try {
//反射获取函数
method = PackageManager.class.getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
} catch (NoSuchMethodException e) {
error = OTHER_ERROR;
}
if(method!=null){
try {
//调用反射
method.invoke(pm, info.packageName, packageStatsObserver);
} catch (IllegalAccessException e) {
e.printStackTrace();
error = OTHER_ERROR;
} catch (InvocationTargetException e) {
e.printStackTrace();
error = OTHER_ERROR;
}
}
最后,在 IPackageStatsObserver
中回调更新数据
IPackageStatsObserver packageStatsObserver = new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
long codeBytes = pStats.codeSize;
long dataBytes = pStats.dataSize;
long cacheBytes = pStats.cacheSize;
}
};
三、 在 Android O 之后
系统提供了一个存储类来解析已安装应用包,这就是 StorageStatsManager
, 通过提供的 public @NonNull StorageStats queryStatsForPackage(@NonNull UUID storageUuid,@NonNull String packageName, @NonNull UserHandle user)
传入应用 uuid
或者使用默认 StorageManager.UUID_DEFAULT
,查询的应用包名,可以直接查询应用的安装信息。
注意:
* 使用适用在 android O 及之后版本
* 需要用户权限 android.permission.PACKAGE_USAGE_STATS
* 该权限使用 context.requestPermission(...)
可能无效,需要引导用户到设置中开启
示例代码如下:
StorageStatsManager statsManager = (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE);
UserHandle handler = UserHandle.getUserHandleForUid(-2);
try{
StorageStats stats = statsManager.queryStatsForPackage(StorageManager.UUID_DEFAULT, info.packageName, handler);
long codeBytes = stats.getAppBytes();
long dataBytes = stats.getDataBytes();
long cacheBytes = stats.getCacheBytes();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SecurityException e) {
//这里说明没有权限,没有权限只能查询自身应用大小
e.printStackTrace();
}
当没有权限 android.permission.PACKAGE_USAGE_STATS
时,引导用户到设置页面设置
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
context.startActivity(intent);
运行截图:
-
android 8:
- 有权限
PACKAGE_USAGE_STATS
- 无权限
PACKAGE_USAGE_STATS
- 有权限
-
android 5
四、 结尾
这里关于应用大小的查询就结束了,通过 PackageManager
还可以清理手机缓存,更多的使用,可以查阅源码。
附注:
完整代码可以戳我查阅 ->> 完整代码
Demo 示例查阅 ->> Demo