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


Respuestas:


317

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

}

1
@Sathish: espero que te sea útil
Aerrow

1
Sin duda, su publicación es realmente útil, pero recibo una excepción "java.lang.RuntimeException: Error al agregar ventana" y "E / AndroidRuntime (7554): Causado por: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): en android.os.BinderProxy.transact (Método nativo) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): en android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): en android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon

2
@BlueGreen: Hola, espero que este enlace te pueda ayudar, stackoverflow.com/questions/11451393/… , de lo contrario, si estás usando Dialog Class, por favor, compruébalo. :)
Aerrow

1
@Aerrow ... ¿Y si estoy comprobando que mi .apk está instalado o no? en el momento de la instalación ... Recibo la misma excepción al verificar mi paquete com.test.installedornot.Mi tamaño de .apk es más de 9 MB, en ese caso, ¿cómo manejaré esta excepción?
DJhon

@BlueGreen: el código anterior verificará solo la aplicación instalada; en el momento de la instalación, esto no funcionará. Para su caso, use el receptor Broadcast para obtener la notificación después de instalar ese apk.
Aerrow

65

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.


¿Requiere esto algún permiso específico de Android para funcionar?
Bootstrapper

@Bootstrapper: No, no requiere ningún permiso especial.
Jonik

Gracias (Solución de trabajo)
Naveed Ahmad

26

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

Cree un objeto Intent con la información adecuada y luego verifique si el Intent es invocable o no utiliza la siguiente función:

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

55
¡Esto es mejor porque no requiere el uso de excepciones para el control de flujo!
QED

2
¡@QED es terrible la cantidad de personas que usan Excepciones como ifdeclaraciones! Esta es definitivamente la respuesta correcta
ILikeTacos

1
¿Cuál es el contenido de la intención? la cadena con el nombre del paquete no funciona
Henrique de Sousa

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K

Si la aplicación fue deshabilitada, debería estar equivocada.
Hugo

15

Si conoce el nombre del paquete, esto funciona sin usar un bloque try-catch o iterar a través de un montón 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<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return !list.isEmpty();
}

1
return !list.isEmpty();sería más amigable con el estilo java
headsvk

7

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

Es el nombre del paquete de la aplicación. Por ejemplo, "com.example.apps.myapp". He editado mi respuesta para mostrar packageName en lugar de uri.
youravgjoe

3

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

public static boolean appInstalledOrNot(Context context, String uri) {
    PackageManager pm = context.getPackageManager();
    List<PackageInfo> 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;
}

El código anterior en kotlin `` `private fun isAppInstalled (context: Context, uri: String): Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) return packageInfoList.asSequence (). Filter {it? .PackageName = = uri} .any ()} `` `
Kishan B

3

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<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}

2

La aplicación Check está instalada o no en Android usando kotlin.

Creando la extensión de Kotlin.

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

Ahora, puede verificar si la aplicación está instalada o no

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}

1

Prueba esto

Este código se usa para verificar si su aplicación con el nombre del paquete está instalado o no; si no, se abrirá el enlace de Play Store 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 );
    }

1

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")

0

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

0

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

Por lo tanto, esta solución verifica 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;
     }
}

Llama al método isPackageInstalled():

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

Ahora, usa la variable booleana isAppInstalledy haz lo que quieras.

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

0

Una buena respuesta a otros problemas. ¡Si no quiere diferenciar "com.myapp.debug" y "com.myapp.release", por ejemplo!

public static boolean isAppInstalled(final Context context, final String packageName) {
    final List<ApplicationInfo> appsInfo = context.getPackageManager().getInstalledApplications(0);
    for (final ApplicationInfo appInfo : appsInfo) {
        if (appInfo.packageName.contains(packageName)) return true;
    }
    return false;
}

0

Tan amable con Kotlin suger:

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.