AppInfoProvider提供应用信息的工具类
package com.loaderman.demo; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import java.io.File; import java.util.ArrayList; import java.util.List; /** * <p> * 提供应用信息的工具类 * <p> * 软件安装位置: * <manifest xmlns:android="http://schemas.android.com/apk/res/android" * android:installLocation="internalOnly"//默认只允许安装在手机内存 * > * preferExternal: 优先sdcard, 如果sdcard已满,不存在, 就安装在手机内存 * auto: 优先手机内存 * <p> * 软件安装流程: * 1. 默认, 第三方软件安装时, 系统将apk拷贝到data/app目录下, 完成安装! 用户可以选择将apk移动到sdcard * 2. 系统软件: system/app目录下 * <p> * ROOT: 获取手机系统管理员权限, 默认手机出厂后都没有ROOT * 一旦ROOT, 所有文件都可以随意修改, 不安全 * <p> * 使用一键Root大师, 刷机大师, 都可以ROOT手机 */ public class AppInfoProvider { //获取已安装的app public static ArrayList<AppInfo> getInstalledApps(Context ctx) { PackageManager pm = ctx.getPackageManager(); List<PackageInfo> installedPackages = pm.getInstalledPackages(0);//获取已安装的app ArrayList<AppInfo> list = new ArrayList<>(); for (PackageInfo packageInfo : installedPackages) { AppInfo info = new AppInfo(); String packageName = packageInfo.packageName;//包名 info.packageName = packageName; ApplicationInfo applicationInfo = packageInfo.applicationInfo;//应用信息的对象 String name = applicationInfo.loadLabel(pm).toString();//应用名称 Drawable icon = applicationInfo.loadIcon(pm);//图标对象 info.name = name; info.icon = icon; String sourceDir = applicationInfo.sourceDir;//apk的安装路径 File file = new File(sourceDir); long size = file.length();//文件大小 info.size = size; //System.out.println(name); //判断软件安装位置 //状态机 int flags = applicationInfo.flags;//标记, 可以记录当前app的一些特性 if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) > 0) { //就认为当前app具备FLAG_EXTERNAL_STORAGE特性 //安装在sdcard info.isSdcard = true; } else { //安装在手机内存 info.isSdcard = false; } //判断软件类型, 用户?系统? if ((flags & ApplicationInfo.FLAG_SYSTEM) > 0) { //就认为当前app具备FLAG_SYSTEM特性 //系统应用 info.isUserApp = false; } else { //用户应用 info.isUserApp = true; } list.add(info); } return list; } }
package com.loaderman.demo; import android.graphics.drawable.Drawable; /** *应用对象 */ public class AppInfo { public String packageName; public String name; public Drawable icon; public long size; public boolean isSdcard;//标记是否安装在sdcard public boolean isUserApp;//标记是否是用户应用 }
最后,关注【码上加油站】微信公众号后,有疑惑有问题想加油的小伙伴可以码上加入社群,让我们一起码上加油吧!!!