Как узнать, существует ли конкретный пакет на моем Android-устройстве?

Как я могу узнать, существует ли на моем устройстве Android конкретный пакет или приложение – скажем, «com.android.abc»?

Вызовите любой из приведенных ниже методов с именем пакета.

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

Вы должны использовать функцию getInstalledPackages() называемую getInstalledPackages() чтобы получить список всех установленных пакетов и поиск того, который вас интересует. Обратите внимание, что имя пакета находится в поле PackageInfo.packageName .

 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; 

Без использования блока 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; } 

Поскольку некоторые устройства сообщают, что «getInstalledPackages» может вызвать TransactionTooLargeException ( здесь , здесь и здесь ), я думаю, вы также должны иметь резервную копию, как я сделал ниже.

Эта проблема должна была быть исправлена ​​на Android 5.1 (читайте здесь ), но некоторые до сих пор сообщили об этом.

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

Если вы просто хотите использовать adb:

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

Он перечислит все установленные пакеты.