package com.uiui.os.utils; import android.app.Application; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.text.TextUtils; import android.util.Log; import com.uiui.os.BuildConfig; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class APKUtils { private static String[] excludePackageName = {BuildConfig.APPLICATION_ID}; public static ArrayList queryFilterAppInfo(Context context) { PackageManager pm = context.getPackageManager(); // 查询所有已经安装的应用程序 List appInfos = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);// GET_UNINSTALLED_PACKAGES代表已删除,但还有安装目录的 ArrayList applicationInfos = new ArrayList<>(); // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); // 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0); Set allowPackages = new HashSet(); for (ResolveInfo resolveInfo : resolveinfoList) { allowPackages.add(resolveInfo.activityInfo.packageName); } for (ApplicationInfo app : appInfos) { // if((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0)//通过flag排除系统应用,会将电话、短信也排除掉 // { // applicationInfos.add(app); // } // if(app.uid > 10000){//通过uid排除系统应用,在一些手机上效果不好 // applicationInfos.add(app); // } if (allowPackages.contains(app.packageName) && !Arrays.asList(excludePackageName).contains(app.packageName)) { // if (allowPackages.contains(app.packageName)) { applicationInfos.add(app); } } return applicationInfos; } /** * 获取第三方应用 * * @param context * @return */ public static List queryFilterAppList(Context context) { PackageManager pm = context.getPackageManager(); // 查询所有已经安装的应用程序 List appInfos = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);// GET_UNINSTALLED_PACKAGES代表已删除,但还有安装目录的 List applicationInfos = new ArrayList<>(); for (ApplicationInfo app : appInfos) { // Log.e("queryFilterAppInfo", String.valueOf(app.flags)); // Log.e("queryFilterAppInfo", String.valueOf((app.flags & mask))); if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { //通过flag排除系统应用,会将电话、短信也排除掉 } else { applicationInfos.add(app.packageName); Log.e("queryFilterAppInfo", app.packageName); } } return applicationInfos; } public static PackageInfo getPackageInfo(Context context, String pkg) { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = null; try { packageInfo = packageManager.getPackageInfo(pkg, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return packageInfo; } public static ApplicationInfo getApplicationInfo(Context context, String pkg) { PackageManager packageManager = context.getPackageManager(); ApplicationInfo applicationInfo = null; try { applicationInfo = packageManager.getApplicationInfo(pkg, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return applicationInfo; } public static void openApp(Context context, String packageName) { Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName); if (intent != null) { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } public static Intent getAppOpenIntentByPackageName(Context context, String packageName) { //Activity完整名 String mainAct = null; //根据包名寻找 PackageManager pkgMag = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK); List list = pkgMag.queryIntentActivities(intent, PackageManager.GET_ACTIVITIES); for (int i = 0; i < list.size(); i++) { ResolveInfo info = list.get(i); if (info.activityInfo.packageName.equals(packageName)) { mainAct = info.activityInfo.name; break; } } if (TextUtils.isEmpty(mainAct)) { return null; } intent.setComponent(new ComponentName(packageName, mainAct)); return intent; } public static Context getPackageContext(Context context, String packageName) { Context pkgContext = null; if (context.getPackageName().equals(packageName)) { pkgContext = context; } else { // 创建第三方应用的上下文环境 try { pkgContext = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } return pkgContext; } public static boolean openPackage(Context context, String packageName) { Context pkgContext = getPackageContext(context, packageName); Intent intent = getAppOpenIntentByPackageName(context, packageName); if (pkgContext != null && intent != null) { pkgContext.startActivity(intent); return true; } return false; } public static String getAPPVersionName(Context context, String packageName) { String versionName = "0"; if (TextUtils.isEmpty(packageName)) { return versionName; } PackageManager pm = context.getPackageManager(); try { PackageInfo packageInfo = pm.getPackageInfo(packageName, 0); versionName = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return versionName; } }