【问题标题】:Get number of installed apps on an Android device?获取 Android 设备上已安装应用程序的数量?
【发布时间】:2016-11-17 02:27:15
【问题描述】:

我正在制作一个 Android 启动器,作为自己制作 Android 应用程序的介绍,我的部分设计要求我知道用户设备上安装了多少应用程序,并且最好只计算那些是正常应用程序的应用程序可以启动。我希望将这个数量的应用程序存储在一个全局整数变量中。只考虑这个目标,将这个数字作为变量检索的最简单方法是什么?

【问题讨论】:

    标签: java android


    【解决方案1】:

    你可以使用PackageManagergetInstalledApplications()方法。

    来自documentation

    返回一个List 上安装的所有应用程序包 设备。如果标志GET_UNINSTALLED_PACKAGES 已设置,所有的列表 包括使用DONT_DELETE_DATA 删除的应用程序(部分 已安装的带有数据目录的应用程序)将被返回。

    这样的事情应该可以工作:

    int numberOfInstalledApps = getPackageManager(0).getInstalledApplications().size();
    

    要过滤掉系统应用,您可以执行以下操作:

    int numberOfNonSystemApps = 0;
    
    List<ApplicationInfo> appList = getPackageManager().getInstalledApplications(0);
    for(ApplicationInfo info : appList) {
        if((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            numberOfNonSystemApps++;
        }
    }
    

    【讨论】:

    • 非常感谢,这完全符合我的需要,这是我发现的第一件事,它确实有效。这是我在互联网上看到的最简单的解决方案。
    【解决方案2】:

    所有非系统应用程序都有一个启动意图,因此您只需要获取所有应用程序的列表并检查其中有多少具有启动意图,否则该应用程序将是系统应用程序。包管理器可以轻松检索所有应用程序,然后我们在查找可用启动意图的同时查看所有应用程序的信息。

    如建议by Darshan Patel : @Brad Larson♦

    PackageManager pm = getPackageManager();
    int nonSysAppsCount=0;
    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();
               nonSysAppsCount++;
                   //This app is a non-system app
        }
        else{
            //System App
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您正在寻找安装在给定设备上的非系统应用程序,您可以执行以下操作:

      public static ArrayList<String> getInstalledApps() {
          ArrayList<String> appList = new ArrayList<>();
          List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
          for (int i=0; i < packList.size(); i++) {
              PackageInfo packInfo = packList.get(i);
              if (  (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
                  String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
                  appList.add(appName);
                  Log.e("App >" + Integer.toString(i), appName);
              }
          }
          return appList;
      }
      

      所以,你可以这样做:

      int number = getInstalledApps().size();
      

      此外,您可以通过调用来启动任何应用程序:

      Intent myIntent = new Intent(Intent.ACTION_MAIN, null);
      myIntent.addCategory(Intent.CATEGORY_LAUNCHER);
      List appsList = context.getPackageManager().queryIntentActivities(myIntent, 0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        相关资源
        最近更新 更多