【问题标题】:How can I find if a particular package exists on my Android device?如何查找我的 Android 设备上是否存在特定包?
【发布时间】:2011-10-09 04:28:17
【问题描述】:

我如何才能找到特定的包或应用程序,例如:com.android.abc,是否存在于我的 Android 设备上?

【问题讨论】:

    标签: android android-applicationinfo


    【解决方案1】:

    使用包名调用以下任何方法。

    import android.content.pm.PackageManager;
    
    // ...
    
        public boolean isPackageExisted(String targetPackage){
            List<ApplicationInfo> packages;
            PackageManager pm;
    
            pm = getPackageManager();        
            packages = pm.getInstalledApplications(0);
            for (ApplicationInfo packageInfo : packages) {
                if(packageInfo.packageName.equals(targetPackage))
                    return true;
            }
            return false;
        }
    

     import android.content.pm.PackageManager;
    
     public boolean isPackageExisted(String targetPackage){
       PackageManager pm=getPackageManager();
       try {
         PackageInfo info=pm.getPackageInfo(targetPackage,PackageManager.GET_META_DATA);
       } catch (PackageManager.NameNotFoundException e) {
         return false;
       }  
       return true;
     }
    

    【讨论】:

    • 谢谢 Rasel,我只是在找这个。非常感谢你。
    • 我必须导入什么才能让它工作?我收到cannot resolve symbol 'PackageManager' 错误。
    • 第二种方法更快
    • 这需要任何许可吗?我还是假的!
    【解决方案2】:

    不使用 try-catch 块或遍历一堆包:

    public static boolean isPackageInstalled(Context context, String packageName) {
        final PackageManager packageManager = context.getPackageManager();
        Intent intent = packageManager.getLaunchIntentForPackage(packageName);
        if (intent == null) {
            return false;
        }
        List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
    }
    

    【讨论】:

      【解决方案3】:

      科特林

      fun isPackageExist(context: Context, target: String): Boolean {
           return context.packageManager.getInstalledApplications(0).find { info -> info.packageName == target } != null
      }
      

      【讨论】:

        【解决方案4】:
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        PackageManager packageManager = getPackageManager();
        List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
        boolean isIntentSafe = activities.size() > 0;
        

        【讨论】:

          【解决方案5】:

          我们可以这样检查:

           if(getPackageManager().hasSystemFeature("android.software.webview") == true && isPackageExisted("com.google.android.webview")) {
                      if (Constant.isNetworkConnected(Activity.this)) {
                           //Your Intent 
                      } else {
                          Toast.makeText(getApplicationContext(), resources.getString(R.string.internet_error), Toast.LENGTH_SHORT).show();
                      }
                  }   else
                      {
                          Constant.showDialog(Activity.this,"Please install the webview");
                      }
              }
          

          制作包检查方法!这归功于“Kavi”https://stackoverflow.com/a/30708227/6209105

          public boolean isPackageExisted(String targetPackage) {
              List<ApplicationInfo> packages;
              PackageManager pm;
          
              pm = getPackageManager();
              packages = pm.getInstalledApplications(0);
              for (ApplicationInfo packageInfo : packages) {
                  if(packageInfo.packageName.equals(targetPackage))
                  {
                      return true;
                  }
          }
          return false;
          

          }

          【讨论】:

            【解决方案6】:

            您应该使用PackageManager 的函数getInstalledPackages() 来获取所有已安装软件包的列表并搜索您感兴趣的软件包。请注意,软件包名称位于PackageInfo.packageName 字段中。

            【讨论】:

              【解决方案7】:

              如果你只想使用 adb:

              adb shell "pm list packages"|cut -f 2 -d ":"
              

              它将列出所有已安装的软件包。

              【讨论】:

                【解决方案8】:

                您可以使用 pm.getPackageUid() 而不是遍历 pm.getInstalledApplications()

                 boolean isPackageInstalled;
                 PackageManager pm = getPackageManager();   
                 int flags = 0; 
                        try 
                        {   
                              pm.getPackageUid(packageName,flags);               
                              isPackageInstalled = true;    
                        }   
                        catch (final PackageManager.NameNotFoundException nnfe) 
                        {   
                            isPackageInstalled = false; 
                        }                   
                 return isPackageInstalled;
                

                【讨论】:

                • getPackageUid - 不过是在 API 级别 24 中添加的。
                【解决方案9】:

                由于某些设备报告“getInstalledPackages”可能导致 TransactionTooLargeException(检查 hereherehere),我认为您也应该像我在下面所做的那样有一个后备。

                本应在 Android 5.1 上修复此问题(阅读 here),但仍有一些人对此进行了报告。

                public static List<String> getInstalledPackages(final Context context) {
                    List<String> result = new ArrayList<>();
                    final PackageManager pm = context.getPackageManager();
                    try {
                        List<PackageInfo> apps = pm.getInstalledPackages(0);
                        for (PackageInfo packageInfo : apps)
                            result.add(packageInfo.packageName);
                        return result;
                    } catch (Exception ignored) {
                        //we don't care why it didn't succeed. We'll do it using an alternative way instead
                    }
                    // use fallback:
                    BufferedReader bufferedReader = null;
                    try {
                        Process process = Runtime.getRuntime().exec("pm list packages");
                        bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                        String line;
                        while ((line = bufferedReader.readLine()) != null) {
                            final String packageName = line.substring(line.indexOf(':') + 1);
                            result.add(packageName);
                        }
                        closeQuietly(bufferedReader);
                        process.waitFor();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        closeQuietly(bufferedReader);
                    }
                    return result;
                }
                
                public static void closeQuietly(final Closeable closeable) {
                    if (closeable == null)
                        return;
                    try {
                        closeable.close();
                    } catch (final IOException e) {
                    }
                }
                

                【讨论】:

                  猜你喜欢
                  • 2017-01-26
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-03-12
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-06-03
                  相关资源
                  最近更新 更多