【问题标题】:How to get the list of all non system apps in android如何获取android中所有非系统应用程序的列表
【发布时间】:2013-05-23 11:13:53
【问题描述】:

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

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();

            }
        }

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

【问题讨论】:

标签: android activity-manager


【解决方案1】:

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

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

对于上述应用,当您查询启动 Intent 时,您将获得 NULL。

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
    }
}

【讨论】:

    【解决方案2】:

    解决方案

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

    List<ApplicationInfo> systemPackages = pm.getInstalledApplications(PackageManager.MATCH_SYSTEM_ONLY);
    

    但是有一个解决方法。 According to documentation,此类应用程序具有 FLAG_SYSTEM 标志。我们使用这个标志来查找非系统应用:

    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
        }
    }
    

    从这两种方法获得的应用程序计数正确。

    【讨论】:

      【解决方案3】:

      仅具有启动意图的标准可能不可靠。它将一些系统应用程序列为非系统应用程序,反之亦然。以下代码提供了所有可启动的非系统应用程序,并且运行良好。

          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);
              }
          }
      

      【讨论】:

      • 这个答案比以前的答案要好,但是自从 Android Oreo 以来不再是 100% 准确:medium.com/@quaful/…
      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 2012-02-12
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多