¿Cómo verificar programáticamente si una aplicación está instalada o no en Android?

Hemos instalado aplicaciones programáticamente.

  1. Si la aplicación ya está instalada en el dispositivo, la aplicación se abre automáticamente.
  2. De lo contrario, instale la aplicación particular.

Guíame. No tengo idea. Gracias.

Prueba con esto:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Add respective layout setContentView(R.layout.main_activity); // Use package name which we want to check boolean isAppInstalled = appInstalledOrNot("com.check.application"); if(isAppInstalled) { //This intent will help you to launch if the package is already installed Intent LaunchIntent = getPackageManager() .getLaunchIntentForPackage("com.check.application"); startActivity(LaunchIntent); Log.i("Application is already installed."); } else { // Do whatever we want to do if application not installed // For example, Redirect to play store Log.i("Application is not currently installed."); } } private boolean appInstalledOrNot(String uri) { PackageManager pm = getPackageManager(); try { pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); return true; } catch (PackageManager.NameNotFoundException e) { } return false; } } 

Solución algo más limpia que la respuesta aceptada (basada en esta pregunta ):

 public static boolean isAppInstalled(Context context, String packageName) { try { context.getPackageManager().getApplicationInfo(packageName, 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } 

Elegí ponerlo en una clase auxiliar como una utilidad estática. Ejemplo de uso:

 boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp"); 

Esta respuesta muestra cómo obtener la aplicación de Play Store si falta la aplicación, aunque se debe tener cuidado en los dispositivos que no tienen Play Store.

El código anterior no funcionó para mí. El siguiente enfoque funcionó.

Cree un objeto Intento con información apropiada y luego verifique si el Intento es invocable o no usando la siguiente función:

 private boolean isCallable(Intent intent) { List list = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } 

Si conoce el nombre del paquete, entonces esto funciona sin usar un bloque try-catch o iterar a través de un grupo de paquetes:

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

Este código verifica que la aplicación esté instalada, pero también verifica que esté habilitada.

 private boolean isAppInstalled(String packageName) { PackageManager pm = getPackageManager(); try { pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES); return pm.getApplicationInfo(packageName, 0).enabled; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return false; } } 

Creo que usar el patrón try / catch no es muy bueno para el rendimiento. Yo aconsejo usar esto:

 public static boolean appInstalledOrNot(Context context, String uri) { PackageManager pm = context.getPackageManager(); List packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES); if (packageInfoList != null) { for (PackageInfo packageInfo : packageInfoList) { String packageName = packageInfo.packageName; if (packageName != null && packageName.equals(uri)) { return true; } } } return false; } 

Solución más limpia (sin try-catch) que la respuesta aceptada (basada en AndroidRate Library ):

 public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) { List packages = context.getPackageManager().getInstalledApplications(0); for (ApplicationInfo packageInfo : packages) { if (targetPackage.equals(packageInfo.packageName)) { return true; } } return false; } 

Prueba esto

Este código se usa para verificar si su aplicación tiene instalado el nombre del paquete o no, de lo contrario, abrirá el enlace de la tienda de juegos de su aplicación, de lo contrario su aplicación instalada

 String your_apppackagename="com.app.testing"; PackageManager packageManager = getPackageManager(); ApplicationInfo applicationInfo = null; try { applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } if (applicationInfo == null) { // not installed it will open your app directly on playstore startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename))); } else { // Installed Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename); startActivity( LaunchIntent ); } 

Respuesta de @Egemen Hamutçu en kotlin B-)

  private fun isAppInstalled(context: Context, uri: String): Boolean { val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES) return packageInfoList.asSequence().filter { it?.packageName == uri }.any() } 

Todas las respuestas solo controlan que cierta aplicación esté instalada o no. Pero, como todos sabemos, el usuario puede instalar una aplicación pero está deshabilitada, inutilizable.

Por lo tanto, esta solución busca ambos. es decir, aplicaciones instaladas Y habilitadas .

 public static boolean isPackageInstalled(String packageName, PackageManager packageManager) { try { return packageManager.getApplicationInfo(packageName, 0).enabled; } catch (PackageManager.NameNotFoundException e) { return false; } } 

Llame al método isPackageInstalled() :

 boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager()); 

Ahora usa la variable booleana isAppInstalled y haz lo que quieras.

 if(isAppInstalled ) { /* do whatever you want */ } 

Una implementación más simple usando Kotlin

 fun PackageManager.isAppInstalled(packageName: String): Boolean = getInstalledApplications(PackageManager.GET_META_DATA) .firstOrNull { it.packageName == packageName } != null 

Y llámalo así (buscando la aplicación Spotify):

 packageManager.isAppInstalled("com.spotify.music")