查询手机已安装应用大小,适配 android 8

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ganfanzhou/article/details/85222864

一、查询手机所有已安装的应用

可以通过 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.aidlPackageStats.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);

运行截图:

  1. android 8:

    • 有权限 PACKAGE_USAGE_STATS
      运行截图
    • 无权限 PACKAGE_USAGE_STATS
      运行截图
  2. android 5
    运行截图

四、 结尾

这里关于应用大小的查询就结束了,通过 PackageManager 还可以清理手机缓存,更多的使用,可以查阅源码。

附注:

完整代码可以戳我查阅 ->> 完整代码

Demo 示例查阅 ->> Demo

猜你喜欢

转载自blog.csdn.net/ganfanzhou/article/details/85222864