前言
从网上查询到的PackageInfo 直接获取的全部的app,这个app不管是否能够启动,是否系统应用,全部都查询了。但是作为LauncherApp 我只需要能够正常启动的app。
我的需求不是系统设置之中的应用管理,不需要那么多app。那么我们在查询过程之中就需要主动进行过滤了。
方法
//获取全部有Launcher关键字的app
public static List<AppInfo> getInstallApps(Context context) {
List<AppInfo> appInfos = new ArrayList<>();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通过查询,获得所有ResolveInfo对象.
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(mainIntent, 0);
// 调用系统排序 , 根据name排序
// 该排序很重要,否则只能显示系统应用,而不能列出第三方应用程序
Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(packageManager));
for (ResolveInfo reInfo : resolveInfos) {
if (BuildConfig.APPLICATION_ID.equals(reInfo.activityInfo.packageName))//过滤到自己本身
continue;
appInfos.add(new AppInfo().setAppInfo(reInfo, packageManager));
}
return appInfos;
}
public class AppInfo {
public String packageName; //app的项目名称- applicationId
public String versionName; //app的版本名称
public long versionCode; //app的版本号
public String appLabel;//app的名称
public Drawable icon;//app的logo图标
public Drawable banner;//广告图
public boolean isSystem;//是否系统应用
public Intent intent;//启动意图
public AppInfo setAppInfo(ResolveInfo resolveInfo, PackageManager packageManager) {
String activityName = resolveInfo.activityInfo.name; // 获得该应用程序的启动Activity的name
packageName = resolveInfo.activityInfo.packageName; // 获得应用程序的包名
appLabel = (String) resolveInfo.loadLabel(packageManager); // 获得应用程序的Label
icon = resolveInfo.loadIcon(packageManager); // 获得应用程序图标
// 为应用程序的启动Activity 准备Intent
intent = new Intent();
intent.setComponent(new ComponentName(packageName, activityName));
if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
//非系统应用
isSystem = false;
} else {
isSystem = true;
//系统应用
}
return this;
}
public AppInfo setAppInfo(PackageInfo packageInfo, PackageManager packageManager) {
packageName = packageInfo.packageName; //app包名
versionName = packageInfo.versionName; //app的versionName
versionCode = packageInfo.versionCode;
appLabel = packageInfo.applicationInfo.loadLabel(packageManager).toString(); //app名
icon = packageInfo.applicationInfo.loadIcon(packageManager); //app图标
banner = packageInfo.applicationInfo.loadBanner(packageManager);
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
//非系统应用
isSystem = false;
} else {
isSystem = true;
//系统应用
}
return this;
}
}
//通过packageName 获取的指定的AppInfo
public static AppInfo getLoadApp(Context context, String packageName) {
AppInfo appInfo = new AppInfo();
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(packageName, 0);
appInfo.setAppInfo(pi, context.getPackageManager());
} catch (PackageManager.NameNotFoundException e) {
appInfo = null;
e.printStackTrace();
}
return appInfo;
}
//卸载
public static void quietUnInstallApk(Context context, String packageManager) {
if ((context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
//非系统应用
Uri uri = Uri.fromParts("package", packageManager, null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
context.startActivity(intent);
} else {
//系统应用- 可以直接跨过逻辑进行卸载
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent sender = PendingIntent.getActivity(context, 0, intent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
PackageInstaller mPackageInstaller = context.getPackageManager().getPackageInstaller();
mPackageInstaller.uninstall(packageManager, sender.getIntentSender());// 卸载APK
}
}
}
评论区