本机APP扫描、打开第三方APP、卸载

QuibblerQuibbler 2020-02-04 约 10 分钟 1752 次阅读

1、扫描手机已安装APP

        通过PackageManager可以获取手机端已安装的apk文件的信息


1.1、获取本机所有已安装应用

PackageManager通过getInstalledPackages(flag)获取,传入flag为0表示所有APP。

PackageManager pm= context.getPackageManager();
    //获取手机内所有应用
    List<PackageInfo> paklist = pm.getInstalledPackages(0);

1.2、获取本机系统应用

(packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0

List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
    for (PackageInfo packageInfo : installedPackages) {
        if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
            //系统预装应用
        }
    }



1.3、获取用户安装应用

(packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0

List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
    for (PackageInfo packageInfo : installedPackages) {
        if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
            //用户安装的APP
            
        }
    }

1.4、获取可以打开的应用

获取到手机应用列表后,可以进行打开应用,卸载等操作。有些APP是服务类型的本身没有Activity,不能打开。需要进行过滤,但是不能单纯的通过系统应用还是非系统应用进行过滤,比如短信、电话属于系统应用,但是可以打开。

①先获取到所有应用

List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);

②通过Intent查询可以打开的ResolveInfo

Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0);

③将可打开的packageName放入Set集合去重

Set<String> canOpenApp = new HashSet<String>();
    for (ResolveInfo resolveInfo : resolveInfos) {
        canOpenApp.add(resolveInfo.activityInfo.packageName);
    }

④在对第一步中获得到的所有应用集合进行遍历,根据第二三步得到的Set进行判断是否可以打开该应用

for (PackageInfo packageInfo : installedPackages) {
        ApplicationInfo applicationInfo = packageInfo.applicationInfo;
        if (canOpenApp.contains(applicationInfo.packageName)) {
            //可以打开的应用,添加到集合
        }
    }

2、打开第三方APP

打开第三方APP方法更多,之前也介绍过打开Activity的几种方法。这里差不多,也是通过Intent去启动第三方APP。不过有时候我们有时候不知道其它APP的具体细节,比如启动的Action,MainActivity类名等。只知道包名也可以直接启动APP。

2.1、通过包名启动

第三方APP的包名很容易获得,通过PackageManager获得启动该APP的Intent:

Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    if (null != intent) {
        context.startActivity(intent);
    }


2.2、通过包名和指定类名启动

        已知包名和类名启动应用程序

Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    //设置包名,和MainActivity
    ComponentName cn = new ComponentName(packageName, className);
    intent.setComponent(cn);
    
    context.startActivity(intent);


2.3、通过包名和Action启动

第三方应用的包名和指定类的action启动,可以启动第三方应用的指定Activity。对方能够处理该Action的应用会自动打开处理。

Intent mIntent = new Intent();
    //包名
    mIntent.setPackage(packageName);
    //某个特点Activity节点下注册的Action
    mIntent.setAction(action);
    
    context.startActivity(mIntent);

3、卸载指定包名的APP

        卸载APP有很多种方法,最简单的是通过Intent调用系统的卸载程序进行卸载。


3.1、通过Intent卸载应用(推荐)

        调用系统的卸载程序进行卸载,需要一个权限,才能正常请求系统进行卸载:

<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />

代码很简单,方法如下:

public static boolean uninstall(Context context, String packageName) {
        if (packageName == null || "".equals(packageName)) {
            return false;
        }
        Uri uri = Uri.parse("package:" + packageName);
        Intent intent = new Intent(Intent.ACTION_DELETE, uri);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
        return true;
    }

弹出系统卸载对话框:

对于系统应用无法卸载,弹出卸载失败通知。

3.2、PackageManager静默卸载应用

系统应用才可以使用,且需要权限android.permission.DELETE_PACKAGES

4、获取第三方应用的图标Drawable

很简单,通过PackageManager得到PackageInfo,再借助其中的ApplicationInfo调用loadIcon(PackageManager)即可得到图标,设置给ImageView。

ApplicationInfo applicationInfo = packageInfo.applicationInfo;
    Drawable iconDrawable = applicationInfo.loadIcon(packageManager);

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w