ITPub博客

首页 > IT职业 > IT生活 > 工具类之AppUtils

工具类之AppUtils

IT生活 作者:wanxud 时间:2021-09-09 09:26:37 0 删除 编辑

花了好大劲总算整理完了应用相关的工具类,老司机没时间多说了,发车~~

isInstallApp          : 判断App是否安装installApp            : 安装App(支持6.0)installAppSilent      : 静默安装AppuninstallApp          : 卸载AppuninstallAppSilent    : 静默卸载AppisAppRoot             : 判断App是否有root权限launchApp             : 打开AppcloseApp              : 关闭AppgetAppPackageName     : 获取App包名getAppDetailsSettings : 获取App具体设置getAppName            : 获取App名称getAppIcon            : 获取App图标getAppPath            : 获取App路径getAppVersionName     : 获取App版本号getAppVersionCode     : 获取App版本码isSystemApp           : 判断App是否是系统应用isAppDebug            : 判断App是否是Debug版本getAppSignature       : 获取App签名getAppSignatureSHA1   : 获取应用签名的的SHA1值isAppForeground       : 判断App是否处于前台getForegroundApp      : 获取前台应用包名getAppInfo            : 获取App信息getAppsInfo           : 获取所有已安装App信息cleanAppData          : 清除App所有数据

import android.annotation.SuppressLint;import android.app.Activity;import android.app.ActivityManager;import android.content.Context;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.Signature;import android.graphics.drawable.Drawable;import java.io.File;import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.List;import java.util.Set;/**
 * 
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2016/8/2
 *     desc  : App相关工具类
 * 
 */public class AppUtils {    private AppUtils() {        throw new UnsupportedOperationException("u can't instantiate me...");     }    /**      * 判断App是否安装      *      * @param context     上下文      * @param packageName 包名      * @return {@code true}: 已安装
{@code false}: 未安装      */     public static boolean isInstallApp(Context context, String packageName) {        return !StringUtils.isSpace(packageName) && IntentUtils.getLaunchAppIntent(context, packageName) != null;     }    /**      * 安装App(支持6.0)      *      * @param context  上下文      * @param filePath 文件路径      */     public static void installApp(Context context, String filePath) {         installApp(context, FileUtils.getFileByPath(filePath));     }    /**      * 安装App(支持6.0)      *      * @param context 上下文      * @param file    文件      */     public static void installApp(Context context, File file) {        if (!FileUtils.isFileExists(file)) return;         context.startActivity(IntentUtils.getInstallAppIntent(file));     }    /**      * 安装App(支持6.0)      *      * @param activity    activity      * @param filePath    文件路径      * @param requestCode 请求值      */     public static void installApp(Activity activity, String filePath, int requestCode) {         installApp(activity, FileUtils.getFileByPath(filePath), requestCode);     }    /**      * 安装App(支持6.0)      *      * @param activity    activity      * @param file        文件      * @param requestCode 请求值      */     public static void installApp(Activity activity, File file, int requestCode) {        if (!FileUtils.isFileExists(file)) return;         activity.startActivityForResult(IntentUtils.getInstallAppIntent(file), requestCode);     }    /**      * 静默安装App      * 

非root需添加权限 {@code }

     *      * @param context  上下文      * @param filePath 文件路径      * @return {@code true}: 安装成功
{@code false}: 安装失败      */     public static boolean installAppSilent(Context context, String filePath) {         File file = FileUtils.getFileByPath(filePath);        if (!FileUtils.isFileExists(file)) return false;         String command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install " + filePath;         ShellUtils.CommandResult commandResult = ShellUtils.execCmd(command, !isSystemApp(context), true);        return commandResult.successMsg != null && commandResult.successMsg.toLowerCase().contains("success");     }    /**      * 卸载App      *      * @param context     上下文      * @param packageName 包名      */     public static void uninstallApp(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return;         context.startActivity(IntentUtils.getUninstallAppIntent(packageName));     }    /**      * 卸载App      *      * @param activity    activity      * @param packageName 包名      * @param requestCode 请求值      */     public static void uninstallApp(Activity activity, String packageName, int requestCode) {        if (StringUtils.isSpace(packageName)) return;         activity.startActivityForResult(IntentUtils.getUninstallAppIntent(packageName), requestCode);     }    /**      * 静默卸载App      * 

非root需添加权限 {@code }

     *      * @param context     上下文      * @param packageName 包名      * @param isKeepData  是否保留数据      * @return {@code true}: 卸载成功
{@code false}: 卸载成功      */     public static boolean uninstallAppSilent(Context context, String packageName, boolean isKeepData) {        if (StringUtils.isSpace(packageName)) return false;         String command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib pm uninstall " + (isKeepData ? "-k " : "") + packageName;         ShellUtils.CommandResult commandResult = ShellUtils.execCmd(command, !isSystemApp(context), true);        return commandResult.successMsg != null && commandResult.successMsg.toLowerCase().contains("success");     }    /**      * 判断App是否有root权限      *      * @return {@code true}: 是
{@code false}: 否      */     public static boolean isAppRoot() {         ShellUtils.CommandResult result = ShellUtils.execCmd("echo root", true);        if (result.result == 0) {            return true;         }        if (result.errorMsg != null) {             LogUtils.d("isAppRoot", result.errorMsg);         }        return false;     }    /**      * 打开App      *      * @param context     上下文      * @param packageName 包名      */     public static void launchApp(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return;         context.startActivity(IntentUtils.getLaunchAppIntent(context, packageName));     }    /**      * 打开App      *      * @param activity    activity      * @param packageName 包名      * @param requestCode 请求值      */     public static void launchApp(Activity activity, String packageName, int requestCode) {        if (StringUtils.isSpace(packageName)) return;         activity.startActivityForResult(IntentUtils.getLaunchAppIntent(activity, packageName), requestCode);     }    /**      * 获取App包名      *      * @param context 上下文      * @return App包名      */     public static String getAppPackageName(Context context) {        return context.getPackageName();     }    /**      * 获取App具体设置      *      * @param context 上下文      */     public static void getAppDetailsSettings(Context context) {         getAppDetailsSettings(context, context.getPackageName());     }    /**      * 获取App具体设置      *      * @param context     上下文      * @param packageName 包名      */     public static void getAppDetailsSettings(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return;         context.startActivity(IntentUtils.getAppDetailsSettingsIntent(packageName));     }    /**      * 获取App名称      *      * @param context 上下文      * @return App名称      */     public static String getAppName(Context context) {        return getAppName(context, context.getPackageName());     }    /**      * 获取App名称      *      * @param context     上下文      * @param packageName 包名      * @return App名称      */     public static String getAppName(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return null;        try {             PackageManager pm = context.getPackageManager();             PackageInfo pi = pm.getPackageInfo(packageName, 0);            return pi == null ? null : pi.applicationInfo.loadLabel(pm).toString();         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return null;         }     }    /**      * 获取App图标      *      * @param context 上下文      * @return App图标      */     public static Drawable getAppIcon(Context context) {        return getAppIcon(context, context.getPackageName());     }    /**      * 获取App图标      *      * @param context     上下文      * @param packageName 包名      * @return App图标      */     public static Drawable getAppIcon(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return null;        try {             PackageManager pm = context.getPackageManager();             PackageInfo pi = pm.getPackageInfo(packageName, 0);            return pi == null ? null : pi.applicationInfo.loadIcon(pm);         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return null;         }     }    /**      * 获取App路径      *      * @param context 上下文      * @return App路径      */     public static String getAppPath(Context context) {        return getAppPath(context, context.getPackageName());     }    /**      * 获取App路径      *      * @param context     上下文      * @param packageName 包名      * @return App路径      */     public static String getAppPath(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return null;        try {             PackageManager pm = context.getPackageManager();             PackageInfo pi = pm.getPackageInfo(packageName, 0);            return pi == null ? null : pi.applicationInfo.sourceDir;         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return null;         }     }    /**      * 获取App版本号      *      * @param context 上下文      * @return App版本号      */     public static String getAppVersionName(Context context) {        return getAppVersionName(context, context.getPackageName());     }    /**      * 获取App版本号      *      * @param context     上下文      * @param packageName 包名      * @return App版本号      */     public static String getAppVersionName(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return null;        try {             PackageManager pm = context.getPackageManager();             PackageInfo pi = pm.getPackageInfo(packageName, 0);            return pi == null ? null : pi.versionName;         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return null;         }     }    /**      * 获取App版本码      *      * @param context 上下文      * @return App版本码      */     public static int getAppVersionCode(Context context) {        return getAppVersionCode(context, context.getPackageName());     }    /**      * 获取App版本码      *      * @param context     上下文      * @param packageName 包名      * @return App版本码      */     public static int getAppVersionCode(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return -1;        try {             PackageManager pm = context.getPackageManager();             PackageInfo pi = pm.getPackageInfo(packageName, 0);            return pi == null ? -1 : pi.versionCode;         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return -1;         }     }    /**      * 判断App是否是系统应用      *      * @param context 上下文      * @return {@code true}: 是
{@code false}: 否      */     public static boolean isSystemApp(Context context) {        return isSystemApp(context, context.getPackageName());     }    /**      * 判断App是否是系统应用      *      * @param context     上下文      * @param packageName 包名      * @return {@code true}: 是
{@code false}: 否      */     public static boolean isSystemApp(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return false;        try {             PackageManager pm = context.getPackageManager();             ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);            return ai != null && (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0;         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return false;         }     }    /**      * 判断App是否是Debug版本      *      * @param context 上下文      * @return {@code true}: 是
{@code false}: 否      */     public static boolean isAppDebug(Context context) {        return isAppDebug(context, context.getPackageName());     }    /**      * 判断App是否是Debug版本      *      * @param context     上下文      * @param packageName 包名      * @return {@code true}: 是
{@code false}: 否      */     public static boolean isAppDebug(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return false;        try {             PackageManager pm = context.getPackageManager();             ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);            return ai != null && (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return false;         }     }    /**      * 获取App签名      *      * @param context 上下文      * @return App签名      */     public static Signature[] getAppSignature(Context context) {        return getAppSignature(context, context.getPackageName());     }    /**      * 获取App签名      *      * @param context     上下文      * @param packageName 包名      * @return App签名      */     @SuppressLint("PackageManagerGetSignatures")    public static Signature[] getAppSignature(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return null;        try {             PackageManager pm = context.getPackageManager();             PackageInfo pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);            return pi == null ? null : pi.signatures;         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return null;         }     }    /**      * 获取应用签名的的SHA1值      * 

可据此判断高德,百度地图key是否正确

     *      * @param context 上下文      * @return 应用签名的SHA1字符串, 比如:53:FD:54:DC:19:0F:11:AC:B5:22:9E:F1:1A:68:88:1B:8B:E8:54:42      */     public static String getAppSignatureSHA1(Context context) {        return getAppSignatureSHA1(context, context.getPackageName());     }    /**      * 获取应用签名的的SHA1值      * 

可据此判断高德,百度地图key是否正确

     *      * @param context     上下文      * @param packageName 包名      * @return 应用签名的SHA1字符串, 比如:53:FD:54:DC:19:0F:11:AC:B5:22:9E:F1:1A:68:88:1B:8B:E8:54:42      */     public static String getAppSignatureSHA1(Context context, String packageName) {         Signature[] signature = getAppSignature(context, packageName);        if (signature == null) return null;        return EncryptUtils.encryptSHA1ToString(signature[0].toByteArray()).                 replaceAll("(?{@code false}: 否      */     public static boolean isAppForeground(Context context) {         ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);         List infos = manager.getRunningAppProcesses();        if (infos == null || infos.size() == 0) return false;        for (ActivityManager.RunningAppProcessInfo info : infos) {            if (info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {                return info.processName.equals(context.getPackageName());             }         }        return false;     }    /**      * 判断App是否处于前台      * 

当不是查看当前App,且SDK大于21时,      * 需添加权限 {@code }

     *      * @param context     上下文      * @param packageName 包名      * @return {@code true}: 是
{@code false}: 否      */     public static boolean isAppForeground(Context context, String packageName) {        return !StringUtils.isSpace(packageName) && packageName.equals(ProcessUtils.getForegroundProcessName(context));     }    /**      * 封装App信息的Bean类      */     public static class AppInfo {        private String   name;        private Drawable icon;        private String   packageName;        private String   packagePath;        private String   versionName;        private int      versionCode;        private boolean  isSystem;        public Drawable getIcon() {            return icon;         }        public void setIcon(Drawable icon) {            this.icon = icon;         }        public boolean isSystem() {            return isSystem;         }        public void setSystem(boolean isSystem) {            this.isSystem = isSystem;         }        public String getName() {            return name;         }        public void setName(String name) {            this.name = name;         }        public String getPackageName() {            return packageName;         }        public void setPackageName(String packagName) {            this.packageName = packagName;         }        public String getPackagePath() {            return packagePath;         }        public void setPackagePath(String packagePath) {            this.packagePath = packagePath;         }        public int getVersionCode() {            return versionCode;         }        public void setVersionCode(int versionCode) {            this.versionCode = versionCode;         }        public String getVersionName() {            return versionName;         }        public void setVersionName(String versionName) {            this.versionName = versionName;         }        /**          * @param name        名称          * @param icon        图标          * @param packageName 包名          * @param packagePath 包路径          * @param versionName 版本号          * @param versionCode 版本码          * @param isSystem    是否系统应用          */         public AppInfo(String packageName, String name, Drawable icon, String packagePath,                        String versionName, int versionCode, boolean isSystem) {            this.setName(name);            this.setIcon(icon);            this.setPackageName(packageName);            this.setPackagePath(packagePath);            this.setVersionName(versionName);            this.setVersionCode(versionCode);            this.setSystem(isSystem);         }        @Override         public String toString() {            return "App包名:" + getPackageName() +                    "nApp名称:" + getName() +                    "nApp图标:" + getIcon() +                    "nApp路径:" + getPackagePath() +                    "nApp版本号:" + getVersionName() +                    "nApp版本码:" + getVersionCode() +                    "n是否系统App:" + isSystem();         }     }    /**      * 获取App信息      * 

AppInfo(名称,图标,包名,版本号,版本Code,是否系统应用)

     *      * @param context 上下文      * @return 当前应用的AppInfo      */     public static AppInfo getAppInfo(Context context) {        return getAppInfo(context, context.getPackageName());     }    /**      * 获取App信息      * 

AppInfo(名称,图标,包名,版本号,版本Code,是否系统应用)

     *      * @param context     上下文      * @param packageName 包名      * @return 当前应用的AppInfo      */     public static AppInfo getAppInfo(Context context, String packageName) {        try {             PackageManager pm = context.getPackageManager();             PackageInfo pi = pm.getPackageInfo(packageName, 0);            return getBean(pm, pi);         } catch (PackageManager.NameNotFoundException e) {             e.printStackTrace();            return null;         }     }    /**      * 得到AppInfo的Bean      *      * @param pm 包的管理      * @param pi 包的信息      * @return AppInfo类      */     private static AppInfo getBean(PackageManager pm, PackageInfo pi) {        if (pm == null || pi == null) return null;         ApplicationInfo ai = pi.applicationInfo;         String packageName = pi.packageName;         String name = ai.loadLabel(pm).toString();         Drawable icon = ai.loadIcon(pm);         String packagePath = ai.sourceDir;         String versionName = pi.versionName;        int versionCode = pi.versionCode;        boolean isSystem = (ApplicationInfo.FLAG_SYSTEM & ai.flags) != 0;        return new AppInfo(packageName, name, icon, packagePath, versionName, versionCode, isSystem);     }    /**      * 获取所有已安装App信息      * 

{@link #getBean(PackageManager, PackageInfo)}(名称,图标,包名,包路径,版本号,版本Code,是否系统应用)

     * 

依赖上面的getBean方法

     *      * @param context 上下文      * @return 所有已安装的AppInfo列表      */     public static List getAppsInfo(Context context) {         List list = new ArrayList();         PackageManager pm = context.getPackageManager();        // 获取系统中安装的所有软件信息         List installedPackages = pm.getInstalledPackages(0);        for (PackageInfo pi : installedPackages) {             AppInfo ai = getBean(pm, pi);            if (ai == null) continue;             list.add(ai);         }        return list;     }    /**      * 清除App所有数据      *      * @param context  上下文      * @param dirPaths 目录路径      * @return {@code true}: 成功
{@code false}: 失败      */     public static boolean cleanAppData(Context context, String... dirPaths) {         File[] dirs = new File[dirPaths.length];        int i = 0;        for (String dirPath : dirPaths) {             dirs[i++] = new File(dirPath);         }        return cleanAppData(context, dirs);     }    /**      * 清除App所有数据      *      * @param context 上下文      * @param dirs    目录      * @return {@code true}: 成功
{@code false}: 失败      */     public static boolean cleanAppData(Context context, File... dirs) {        boolean isSuccess = CleanUtils.cleanInternalCache(context);         isSuccess &= CleanUtils.cleanInternalDbs(context);         isSuccess &= CleanUtils.cleanInternalSP(context);         isSuccess &= CleanUtils.cleanInternalFiles(context);         isSuccess &= CleanUtils.cleanExternalCache(context);        for (File dir : dirs) {             isSuccess &= CleanUtils.cleanCustomCache(dir);         }        return isSuccess;     } }

如果该工具类依赖其他工具类,都可以在我的Android开发人员不得不收集的代码(持续更新中)中找到。



作者:Blankj
链接:https://www.jianshu.com/p/4614d8e9a192

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3451/viewspace-2809918/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-30

  • 博文量
    100
  • 访问量
    1146