Vérifiez si l’application est installée – Android

J’essaie d’installer des applications depuis Google Play. Je peux comprendre que lors de l’ouverture de l’URL du Google Play Store, il ouvre Google Play et lorsque j’appuie sur le bouton Retour, l’activité reprend.

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

Lorsque je suis retourné à l’activité, j’ai essayé d’appeler cela onResume() pour vérifier si l’application est installée, mais je reçois une erreur:

 @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(Ssortingng 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 ; } 

L’erreur est la suivante:

E / AndroidRuntime (796): java.lang.RuntimeException: impossible de démarrer l’activité ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: aucune activité à gérer Intent {act = android .intent.action.VIEW dat = market: // détails? id = com.package.name flg = 0x40080000}

Je suppose que l’activité est onPause() . Existe-t-il un meilleur moyen de le mettre en œuvre? J’essaie de vérifier si l’application a terminé l’installation.

Essaye ça:

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

Il tente d’extraire des informations sur le package dont vous avez transmis le nom. À défaut, si une NameNotFoundException été lancée, cela signifie qu’aucun package portant ce nom n’est installé, nous NameNotFoundException donc false .

Notez que nous passons dans un PackageManager au lieu d’un Context , de sorte que la méthode est légèrement plus flexible et ne viole pas la loi de Demeter . Vous pouvez utiliser la méthode sans accéder à une instance de Context , tant que vous avez une instance PackageManager .

Utilisez-le comme ceci:

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

La réponse de Robin Kanters est juste, mais elle vérifie les applications installées indépendamment de leur état activé ou désactivé.

Nous soaps tous qu’une application peut être installée mais désactivée par l’utilisateur, donc inutilisable.

Cela vérifie les applications installées et activées:

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

Vous pouvez mettre cette méthode dans une classe comme Utils et l’appeler partout en utilisant:

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

Essaye ça:

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

Solution plus rapide:

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

getPackageGids est moins cher avec getPackageInfo , donc il fonctionne plus vite.

 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 

Remarque: Cela ne fonctionnera pas dans certains espaces virtuels. Ils peuvent violer l’API Android et toujours retourner un tableau, même s’il n’y a pas d’application avec ce nom de package.
Dans ce cas, utilisez 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 (Ssortingng 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; }