¿Cómo comprobar mediante programación si una aplicación está instalada o no en Android?
Hemos instalado las aplicaciones de forma programática.
- Si la aplicación ya está instalada en el dispositivo, la aplicación se abre automáticamente.
- De lo contrario, instale la aplicación en particular.
Guíame. No tengo idea. Gracias.
- Cambiar el nombre generado de apk desde "app-debug.apk"
- No se puede desactivar una aplicación de despliegue escalonado de Android desde el área de producción de Play Store
- Android ADB Shell no activa los paquetes
- Android Studio - Ejecutar apk firmado en el emulador
- ¿Cómo firmar APK en Android Studio incluso con cadenas no traducidas?
- Cómo instalar / reemplazar en Android sin usar Eclipse
- Aapt.exe está lanzando una excepción no controlada mientras construye el archivo * .apk para el proyecto de Android en Eclipse
- Contraseña Lost Keystore
- Emitir firmando Android Release Build "No se pudo leer la clave del almacén de claves"
- ¿Cómo puedo convertir un archivo jar en formato apk?
- Error al instalar apk - analizar el paquete
- No se puede ejecutar la aplicación de Android, No se pudo encontrar el problema de .apk en eclipse
- Cómo mostrar el icono de apk en mi Administrador de archivos
Pruebe 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 es necesario tener cuidado en dispositivos que no tienen Play Store.
El código anterior no funcionó para mí. El siguiente enfoque funcionó.
Cree un objeto Intent con la información apropiada y luego compruebe si el Intent es callable o no usando la siguiente función:
private boolean isCallable(Intent intent) { List<ResolveInfo> 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 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.size() > 0; }
Este código comprueba que la aplicación está instalada, pero también comprueba si 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<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; }
- Forzar una actividad de Android para utilizar siempre el modo horizontal
- "Bitmap demasiado grande para ser cargado en una textura"