web-dev-qa-db-fra.com

Vérifiez si l'application est installée - Android

J'essaie d'installer des applications à partir de Google Play. Je peux comprendre que lors de l'ouverture de l'URL du Google Play Store, celui-ci s'ouvre et lorsque j'appuie sur le bouton Précédent, 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);

Quand je suis revenu à l'activité, j'ai essayé d'appeler cette 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(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 ;
}

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é trouvée pour gérer l'intention {act = Android. .intent.action.VIEW dat = marché: // détails? id = com.package.name flg = 0x40080000}

Je suppose que l'activité est onPause(). Y a-t-il un meilleur moyen de le mettre en œuvre? J'essaie de vérifier si l'application a fini d'installer.

79
Siddharthan Asokan

Essaye ça:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {

    boolean found = true;

    try {

        packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {

        found = false;
    }

    return found;
}

Il tente de récupérer des informations sur le paquet dont vous avez transmis le nom. Sinon, si un NameNotFoundException est lancé, cela signifie qu'aucun paquet portant ce nom n'est installé. Nous retournons 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 souple d'utilisation et ne viole pas la loi de Demeter . Vous pouvez utiliser la méthode sans accès à une instance Context si vous avez une instance PackageManager.

Utilisez-le comme ceci:

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}
254
Robin Kanters

La réponse de Robin Kanters est correcte, mais elle vérifie si les applications installées sont activées ou non.

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

Ceci vérifie les applications installées ET :

public static boolean isPackageInstalled(String 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())
19
AndroidGuy

Essaye ça:

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

Solution plus rapide:

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

getPackageGids est moins cher à partir de getPackageInfo, donc cela fonctionne plus rapidement.

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 renvoyer un tableau, même s'il n'y a pas d'application avec ce nom de paquet.
Dans ce cas, utilisez getPackageInfo.

5
Enyby
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}
0
DEVSHK