【问题标题】:How do I find the packages that have Launch by Default set?如何找到设置了默认启动的包?
【发布时间】:2013-12-28 17:59:25
【问题描述】:

我想找到在 Android 应用程序管理器中设置了“默认启动”的包。应用程序管理器通常会说“此应用程序设置为默认打开某些操作”之类的内容,并为这些程序包提供“清除默认值”按钮。

作为示例,此图像显示了 Adob​​e Reader 的应用程序管理器页面,我已将其设置为打开 PDF 文件的默认设置。我希望能够以编程方式确定此包(com.adobe.reader)具有“默认启动”设置,更一般地说,所有具有此类“默认启动”设置的包。 (显然应用程序管理器可以做到这一点。)

我可以通过以下方式获取所有已安装的软件包:

  List<PackageInfo> packages = getPackageManager()
          .getInstalledPackages(0);

如何判断哪些设置了“默认启动”?有没有办法也找到动作?

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    这似乎对我有用:

    /**
     * Get info on the preferred (launch by default) applications.
     * @return
     */
    public String getPreferredAppInfo() {
        List<PackageInfo> packages = getPackageManager()
                .getInstalledPackages(0);
        List<IntentFilter> filters = new ArrayList<IntentFilter>();
        List<ComponentName> activities = new ArrayList<ComponentName>();
        String info = "";
        int nPref = 0, nFilters = 0, nActivities = 0;
        PackageInfo pkg = null;
        for (int i = 0; i < packages.size(); i++) {
            pkg = packages.get(i);
            nPref = getPackageManager().getPreferredActivities(filters,
                    activities, pkg.packageName);
            nFilters = filters.size();
            nActivities = activities.size();
            if (nPref > 0 || nFilters > 0 || nActivities > 0) {
                // This is a launch by default package
                info += "\n" + pkg.packageName + "\n";
                for (IntentFilter filter : filters) {
                    info += "IntentFilter:\n";
                    for (int j = 0; j < filter.countActions(); j++) {
                        info += "    action: " + filter.getAction(j) + "\n";
                    }
                    for (int j = 0; j < filter.countCategories(); j++) {
                        info += "    category: " + filter.getCategory(j) + "\n";
                    }
                    for (int j = 0; j < filter.countDataTypes(); j++) {
                        info += "    type: " + filter.getDataType(j) + "\n";
                    }
                    for (int j = 0; j < filter.countDataAuthorities(); j++) {
                        info += "    data authority: "
                                + filter.getDataAuthority(j) + "\n";
                    }
                    for (int j = 0; j < filter.countDataPaths(); j++) {
                        info += "    data path: " + filter.getDataPath(j)
                                + "\n";
                    }
                    for (int j = 0; j < filter.countDataSchemes(); j++) {
                        info += "    data path: " + filter.getDataScheme(j)
                                + "\n";
                    }
                    // for (ComponentName activity : activities) {
                    // info += "activity="
                    // + activity.flattenToString() + "\n";
                    // }
                }
            }
        }
        return info;
    }
    

    PackageManager.getPreferredActivities() 的返回值似乎为零,而不是注册的首选活动总数,这让我感到震惊。如果它不总是零,检查非零就足以查看包是否设置了“默认启动”。我还发现 PackageManager.getPreferredPackages() 总是为我返回零。我还发现为过滤器和活动(如 Javadoc 中提到的)的 PackageManager.getPreferredActivities() 传递 null 会产生 NullPointerException。

    【讨论】:

      【解决方案2】:

      使用 PackageManager.getLauncherIntent(String packageName) 作为包的默认主启动器 Activity...

      【讨论】:

      【解决方案3】:

      检查下面的代码

      // intents array list has all the launcher intents
      List<PackageInfo> packages = getPackageManager()
                .getInstalledPackages(0);
      Intent  intent = null;
      
      for (Iterator iterator = packages.iterator(); iterator.hasNext();) 
      {
          PackageInfo packageInfo = (PackageInfo) iterator.next();
          String packageName = packageInfo.packageName;
          // adobe reader example is taken. 
            if(packageName.equals(com.adobe.reader))
            {
              intent =getPackageManager().getLaunchIntentForPackage(packageName));
                  break;
            }
      }
         if(intent != null)
           {
              startActivty(intent);
           }
      

      或者您可以尝试使用此链接获取 pdf 文件 link

      【讨论】:

      • 谢谢。请参阅其他类似建议下的评论。
      • 我不想启动 Activity。我想知道 package 是否设置为默认启动某些操作。在示例中,Adobe Reader 设置为默认启动以打开 PDF 文件(这意味着它不会提示您打开 PDF 文件的所有活动的列表)。我在 Adob​​e Reader 的 getLauncherIntent 返回的 Intent 中没有找到任何告诉我这一点的内容。该操作甚至可能会启动包中的其他一些活动。我也没有看到默认启动的活动和不启动的活动返回的 Intent 有任何本质上的不同。
      猜你喜欢
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 2023-03-19
      • 2021-06-05
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2014-05-19
      相关资源
      最近更新 更多