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

147

Hemos instalado aplicaciones mediante programación.

  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.

Sathish Sathish
fuente

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

}
Aerrow
fuente
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.

Jonik
fuente
¿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;  
}
Priyank Desai
fuente
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();
}
Kavi
fuente
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;
    }
}
youravgjoe
fuente
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;
}
Egemen Hamutçu
fuente
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;
}
Alexander Savin
fuente
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
}
Neeraj Dhameliya
fuente
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 );
    }
Sunil
fuente
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")
Víctor Albertos
fuente
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()
    }
Kishan B
fuente
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 */
}
Aashish
fuente
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;
}
Nicolas Duponchel
fuente
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
  }
David
fuente