首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取android中所有非系统应用的列表

如何获取android中所有非系统应用的列表
EN

Stack Overflow用户
提问于 2013-05-23 19:13:54
回答 3查看 4.9K关注 0票数 5

我正在开发一个应用程序,在其中我想获得所有非系统应用程序的列表。下面是我的代码部分:

代码语言:javascript
运行
复制
TextView tv = new TextView(this);
        this.setContentView(tv);

        ActivityManager actvityManager = (ActivityManager)
        this.getSystemService( ACTIVITY_SERVICE );
        PackageManager pm = this.getPackageManager();
        List<PackageInfo> list =pm.getInstalledPackages(0);

        for(int i=0;i<list.size();i++)
        {
            System.out.println("list"+i+"   "+list.get(i));
        }

        for(PackageInfo pi : list) 
        {
            try
            {
                ApplicationInfo ai=pm.getApplicationInfo(pi.packageName, 0);

                if (ai.sourceDir.startsWith("/data/app/"))
                {
                    tv.setText(ai.className);// non system apps
                }
                else 
                {
                     System.out.println("system apps");// system apps
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();

            }
        }

但它显示,所有应用程序都是系统应用程序

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-20 04:13:13

如果应用程序是非系统应用程序,则它必须具有启动意图,通过该意图可以启动该应用程序。如果启动意图为空,则它是一个系统应用程序。

系统应用示例:"com.android.browser.provider“、"com.google.android.voicesearch”。

对于上面的应用,当你查询启动意图时,你会得到NULL。

代码语言:javascript
运行
复制
PackageManager pm = getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for(ApplicationInfo packageInfo:packages){
    if( pm.getLaunchIntentForPackage(packageInfo.packageName) != null ){
                String currAppName = pm.getApplicationLabel(packageInfo).toString();
               //This app is a non-system app
    }
    else{
        //System App
    }
}
票数 15
EN

Stack Overflow用户

发布于 2020-04-27 23:08:07

解决方案

PackageManager提供了一种使用PackageManager.MATCH_SYSTEM_ONLY标志直接查找系统应用程序(而不是非系统应用程序)的方法。

代码语言:javascript
运行
复制
List<ApplicationInfo> systemPackages = pm.getInstalledApplications(PackageManager.MATCH_SYSTEM_ONLY);

但是有一个变通方法。According to documentation,这样的应用程序都有FLAG_SYSTEM标志。我们使用此标志来查找非系统应用程序:

代码语言:javascript
运行
复制
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages) {
    if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM) {
        //system app
    }
    else {
        //non system app
    }
}

这两种方法获得的应用计数都是正确的。

票数 2
EN

Stack Overflow用户

发布于 2016-10-13 14:48:44

只有发射意图的标准可能是不可靠的。它将一些系统应用程序列为非系统应用程序,反之亦然。下面的代码给出了所有可启动的非系统应用程序,它工作得很好。

代码语言:javascript
运行
复制
    PackageManager pm = getPackageManager();
    List<ApplicationInfo> packages = m.getInstalledApplications(PackageManager.GET_META_DATA);
    for(ApplicationInfo appInfo:packages)
    {
        String currAppName = pm.getApplicationLabel(appInfo).toString();
        String srcDir = appInfo.sourceDir;
        //Log.d(TAG, currAppName+": "+srcDir);
        if(srcDir.startsWith("/data/app/") && pm.getLaunchIntentForPackage(appInfo.packageName) != null)
        {
            Log.d(TAG, "NON-SYSTEM APP:"+srcDir);
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16712450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档