美文网首页
Android 读取可启动的app列表

Android 读取可启动的app列表

作者: yunhen | 来源:发表于2019-02-27 11:59 被阅读0次
public List<AppInfo> getAllApps( final OnInstalledPackagesCallback callback) {
        LogUtils.d(TAG,"getAllApps() getInstalledPackages start=" + (System.currentTimeMillis()));
        if (callback!=null)
            callback.onStartGet();
        AppInfo myAppInfo;
        /**
         * GET_ACTIVITIES, GET_CONFIGURATIONS, GET_GIDS, GET_INSTRUMENTATION, GET_INTENT_FILTERS,
         * GET_META_DATA, GET_PERMISSIONS, GET_PROVIDERS, GET_RECEIVERS, GET_SERVICES,
         * GET_SHARED_LIBRARY_FILES, GET_SIGNATURES, GET_URI_PERMISSION_PATTERNS,
         *  MATCH_DISABLED_COMPONENTS, MATCH_DISABLED_UNTIL_USED_COMPONENTS,
         * MATCH_UNINSTALLED_PACKAGES to modify the data returned.
         */
        //获取到所有安装了的应用程序的信息,包括那些卸载了的,但没有清除数据的应用程序
        List<PackageInfo> packageInfos = packageManager
                .getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.GET_ACTIVITIES);
        mStringBuilder = new StringBuilder("\"");
        if (null != mAppInfoAlls) {
            mAppInfoAlls.clear();
        } else {
            mAppInfoAlls = new ArrayList<>();
        }
        for (PackageInfo info : packageInfos) {

            if ( info.activities == null || info.activities.length == 0) {
                //没有activity ,表示不能打开
                continue;
            }
            Intent queryActIntent = new Intent(Intent.ACTION_MAIN,null);
            queryActIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            queryActIntent.setPackage(info.packageName);
            List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(queryActIntent,0);
            if (resolveInfoList == null || resolveInfoList.isEmpty()) {
                continue;
            }

            ResolveInfo resolveinfo = resolveInfoList.iterator().next();
            if (resolveinfo == null) {
                continue;
            }
            String actClsName = resolveinfo.activityInfo.name;
            if (actClsName == null) {
                continue;

            }
            myAppInfo = new AppInfo();
            //拿到包名
            String packageName = info.packageName;
            //拿到应用程序的信息
            ApplicationInfo appInfo = info.applicationInfo;

            //拿到应用程序的大小
            //long codesize = packageStats.codeSize;

            myAppInfo.setPackageName(packageName);
            //拿到应用程序的程序名
            String appName = packageManager.getApplicationLabel(appInfo).toString();

            myAppInfo.setAppName(appName);
            //拿到应用程序的图标
            myAppInfo.setIcon(packageManager.getApplicationIcon(appInfo));

            ConstUtil.saveWechatVersion(info);
            if (filterApp(appInfo)) {
                myAppInfo.setSystemApp(false);
            } else {
                myAppInfo.setSystemApp(true);
            }
            mStringBuilder.append(myAppInfo.appName + "\",\"");
            mAppInfoAlls.add(myAppInfo);
            LogUtils.d(TAG,"getAllApps() info.name  =" + (packageManager.getApplicationLabel(info.applicationInfo).toString()));


        }
        if (callback!=null)
            callback.onFinish(mAppInfoAlls);

        LogUtils.d(TAG,"getAllApps() getInstalledPackages   end=" + (System.currentTimeMillis()));
        return mAppInfoAlls;
    }
//这个方法很多app 不会显示出来
public void getAllAppsCanOpen() {
        Intent mainIntent = new Intent(Intent.ACTION_MAIN,null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        // 通过查询,获得所有ResolveInfo对象.
        List<ResolveInfo> resolveInfos = packageManager
                .queryIntentActivities(mainIntent,0);
        // 调用系统排序 , 根据name排序
        // 该排序很重要,否则只能显示系统应用,而不能列出第三方应用程序
        Collections.sort(resolveInfos,new ResolveInfo.DisplayNameComparator(packageManager));
        mStringBuilder = new StringBuilder("");
        if (mAppInfoAlls != null) {
            mAppInfoAlls.clear();
        } else {
            mAppInfoAlls = new ArrayList<>();
        }
        for (ResolveInfo reInfo : resolveInfos) {
            String activityName = reInfo.activityInfo.name; // 获得该应用程序的启动Activity的name
            String pkgName = reInfo.activityInfo.packageName; // 获得应用程序的包名
            String appLabel = (String)reInfo.loadLabel(packageManager); // 获得应用程序的Label
            Drawable icon = reInfo.loadIcon(packageManager); // 获得应用程序图标
            // 为应用程序的启动Activity 准备Intent
            Intent launchIntent = new Intent();
            launchIntent.setComponent(new ComponentName(pkgName,
                    activityName));
            // 创建一个AppInfo对象,并赋值
            AppInfo appInfo = new AppInfo();
            appInfo.setAppName(appLabel);
            appInfo.setPackageName(pkgName);
            appInfo.setIcon(icon);
            appInfo.setIntent(launchIntent);
            mStringBuilder.append(appLabel + "\n");
            mAppInfoAlls.add(appInfo); // 添加至列表中

        }
        

    }
//这里是首字母升序排列
 Collections.sort(resolveInfos,new ResolveInfo.DisplayNameComparator(packageManager));

相关文章

网友评论

      本文标题:Android 读取可启动的app列表

      本文链接:https://www.haomeiwen.com/subject/jqixuqtx.html