Comprueba si la aplicación está instalada: Android

Estoy tratando de instalar aplicaciones de Google Play. Puedo entender que al abrir la URL de la tienda de Google Play, se abre Google Play y cuando presiono el botón Atrás, la actividad se reanuda.

Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL)); marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); startActivity(marketIntent); 

Cuando volví a la actividad, intenté llamar a esto en onResume() para comprobar si la aplicación está instalada, pero recibí un error:

 @Override protected void onResume() { super.onResume(); boolean installed = false; while (!installed) { installed = appInstalledOrNot(APPPACKAGE); if (installed) { Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show(); } } } private boolean appInstalledOrNot(String uri) { PackageManager pm = getPackageManager(); boolean app_installed = false; try { pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); app_installed = true; } catch (PackageManager.NameNotFoundException e) { app_installed = false; } return app_installed ; } 

El error es el siguiente:

E / AndroidRuntime (796): java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: no se encontró actividad para manejar el bash {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}

Supongo que la actividad es onPause() . ¿Hay una mejor manera de implementarlo? Estoy tratando de verificar si la aplicación se terminó de instalar.

Prueba esto:

 private boolean isPackageInstalled(String packagename, PackageManager packageManager) { try { packageManager.getPackageInfo(packagename, 0); return true; } catch (NameNotFoundException e) { return false; } } 

Intenta obtener información sobre el paquete cuyo nombre ha pasado. De lo NameNotFoundException , si se ha lanzado una NameNotFoundException , significa que no hay ningún paquete con ese nombre instalado, por lo que devolveremos el valor false .

Tenga en cuenta que pasamos un PackageManager lugar de un Context , por lo que el método es un poco más flexible de usar y no viola la ley de Demeter . Puede usar el método sin acceso a una instancia de Context , siempre que tenga una instancia de PackageManager .

Úselo así:

 public void someMethod() { // ... PackageManager pm = context.getPackageManager(); boolean isInstalled = isPackageInstalled("com.somepackage.name", pm); // ... } 

La respuesta de Robin Kanters es correcta, pero verifica las aplicaciones instaladas independientemente de su estado habilitado o deshabilitado.

Todos sabemos que una aplicación puede ser instalada pero deshabilitada por el usuario, por lo tanto inutilizable.

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

Puede poner este método en una clase como Utils y llamarlo a todas partes usando:

 boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager()) 

Prueba esto:

 public static boolean isAvailable(Context ctx, Intent intent) { final PackageManager mgr = ctx.getPackageManager(); List list = mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } 

Una solución más rápida:

 private boolean isPackageInstalled(String packagename, PackageManager packageManager) { try { packageManager.getPackageGids(packagename); return true; } catch (NameNotFoundException e) { return false; } } 

getPackageGids es menos costoso de getPackageInfo , por lo que funciona más rápido.

 Run 10000 on API 15 Exists pkg: getPackageInfo: nanoTime = 930000000 getPackageGids: nanoTime = 350000000 Not exists pkg: getPackageInfo: nanoTime = 420000000 getPackageGids: nanoTime = 380000000 Run 10000 on API 17 Exists pkg: getPackageInfo: nanoTime = 2942745517 getPackageGids: nanoTime = 2443716170 Not exists pkg: getPackageInfo: nanoTime = 2467565849 getPackageGids: nanoTime = 2479833890 Run 10000 on API 22 Exists pkg: getPackageInfo: nanoTime = 4596551615 getPackageGids: nanoTime = 1864970154 Not exists pkg: getPackageInfo: nanoTime = 3830033616 getPackageGids: nanoTime = 3789230769 Run 10000 on API 25 Exists pkg: getPackageInfo: nanoTime = 3436647394 getPackageGids: nanoTime = 2876970397 Not exists pkg: getPackageInfo: nanoTime = 3252946114 getPackageGids: nanoTime = 3117544269 

Nota: Esto no funcionará en algunos espacios virtuales. Pueden violar la API de Android y devolver siempre una matriz, incluso si no hay una aplicación con ese nombre de paquete.
En este caso, use getPackageInfo .

 @Override protected void onResume() { super.onResume(); boolean installed = false; while (!installed) { installed = appInstalledOrNot (APPPACKAGE); if (installed) { Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show (); } } } private boolean appInstalledOrNot (String uri) { PackageManager pm = getPackageManager(); boolean app_installed = false; try { pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); app_installed = true; } catch (PackageManager.NameNotFoundException e) { app_installed = false; } return app_installed; }