实战-应用安装不显示

需求
通过黑白名单,控制Launcher & <我的应用> 应用显示或者不显示(展示应用图标)

实现
核心实现在ApplicationPackageManager,getInstalledPackages和queryIntentActivities 中进行拦截
frameworks/base/core/java/android/app/ApplicationPackageManager.java

public List<PackageInfo> getInstalledPackages(int flags) {
        //return getInstalledPackagesAsUser(flags, mContext.getUserId());
        List<PackageInfo> infos = getInstalledPackagesAsUser(flags, mContext.getUserId());
        if (null != infos && infos.size() > 0) {
            Set<String> pkgSet = getNotDisplayInLauncherPkg();
            boolean isSystemApp = isSystemAppType();
            Iterator it = infos.iterator();
            while (it.hasNext()) {
                PackageInfo info = (PackageInfo) it.next();
                if (notDisplayInLauncher(info.packageName, pkgSet, isSystemApp)) {
                    it.remove();
                }
            }
        }
        return infos;
    }
public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
        List<ResolveInfo> infos = queryIntentActivitiesAsUser(intent, flags, mContext.getUserId());
        if (null != intent.getCategories() && intent.getCategories().contains("android.intent.category.LAUNCHER")
                && "android.intent.action.MAIN".equals(intent.getAction())) {
            if (null != infos && infos.size() > 0) {
                Set<String> pkgSet = getNotDisplayInLauncherPkg();
                boolean isSystemApp = isSystemAppType();
                Iterator it = infos.iterator();
                while (it.hasNext()) {
                    ResolveInfo info = (ResolveInfo) it.next();
                    if (notDisplayInLauncher(info.activityInfo.packageName, pkgSet, isSystemApp)) {
                        it.remove();
                    }
                }
            }
        }
        return infos;
    }

辅助函数

private boolean isSystemAppType() {
        try {
            PackageInfo pInfo = getPackageInfo(mContext.getPackageName(), 0);
            if (isSystemApp(pInfo) || isSystemUpdateApp(pInfo)) {
                return true;
            } else {
                return false;
            }

        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }

    private boolean isSystemApp(PackageInfo pInfo) {
        return ((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
    }

    private boolean isSystemUpdateApp(PackageInfo pInfo) {
        return ((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0);
    }

    private boolean notDisplayInLauncher(String packageName, Set<String> pkgSet, boolean isSystemApp) {
        if (null != pkgSet && pkgSet.contains(packageName)) {
            return true;
        }
        //如果是系统应用,则不进行过滤
        if (!isSystemApp) {
            try {
                PackageInfo pInfo = getPackageInfo(packageName, 0);
                if (isSystemApp(pInfo) || isSystemUpdateApp(pInfo)) {
                    return true;
                }
            } catch (NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    private Set<String> getNotDisplayInLauncherPkg () {
        Set<String> pkgSet = new HashSet<String>();
        pkgSet.add("com.android.browser");
//        pkgSet.add("com.android.settings");
//        pkgSet.add("com.android.tv.settings");
//        pkgSet.add("com.android.camera2");
		//ThirdPartyPermissions.getInstalledAdApps 这里为自定义的黑名单,可自行定义
        List<String> installedAdApps = ThirdPartyPermissions.getInstalledAdApps(mContext);
        if (installedAdApps != null && installedAdApps.size() > 0) {
            for (String pkgName : installedAdApps) {
                pkgSet.add(pkgName);
            }
        }
        return pkgSet;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值