Comment vérifier par programme si une application est installée ou non sous Android?

147

Nous avons installé des applications par programmation.

  1. Si l'application est déjà installée sur l'appareil, l'application s'ouvre automatiquement.
  2. Sinon, installez l'application particulière.

Guidez-moi. Je n'ai aucune idée. Merci.

Sathish Sathish
la source

Réponses:

317

Essayez avec ceci:

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
la source
1
@Sathish: J'espère que cela pourra vous être utile
Aerrow
1
Nul doute que votre message est vraiment utile, mais j'obtiens une exception "java.lang.RuntimeException: L'ajout de la fenêtre a échoué" et "E / AndroidRuntime (7554): Causé par: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): sur android.os.BinderProxy.transact (Méthode native) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): sur android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): at android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon
2
@BlueGreen: Salut, j'espère que ce lien peut vous aider, stackoverflow.com/questions/11451393/… , sinon si vous utilisez Dialog Class, veuillez le vérifier. :)
Aerrow
1
@Aerrow .. Supposons que je vérifie que mon .apk est installé ou non? au moment de l'installation ... J'obtiens la même exception en vérifiant mon package com.test.installedornot.Ma taille .apk est supérieure à 9 Mo alors dans ce cas, comment vais-je gérer cette exception?
DJhon
@BlueGreen: Le code ci-dessus vérifiera uniquement l'application installée, au moment de l'installation, cela ne fonctionnera pas. Dans votre cas, utilisez le récepteur de diffusion pour obtenir la notification une fois l'apk installé.
Aerrow
65

Solution un peu plus propre que la réponse acceptée (basée sur cette question ):

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

J'ai choisi de le mettre dans une classe d'assistance en tant qu'utilitaire statique. Exemple d'utilisation:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

Cette réponse montre comment obtenir l'application depuis le Play Store si l'application est manquante, bien que des précautions doivent être prises sur les appareils qui ne disposent pas du Play Store.

Jonik
la source
cela nécessite-t-il des autorisations Android spécifiques pour fonctionner?
Bootstrapper
@Bootstrapper: Non, il ne nécessite aucune autorisation spéciale.
Jonik
Merci (solution de travail)
Naveed Ahmad
26

Le code ci-dessus n'a pas fonctionné pour moi. L'approche suivante a fonctionné.

Créez un objet Intent avec les informations appropriées, puis vérifiez si l'intent est appelable ou non à l'aide de la fonction suivante:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}
Priyank Desai
la source
5
C'est mieux car cela ne nécessite pas l'utilisation d'exceptions pour le contrôle de flux!
QED
2
@QED c'est épouvantable le nombre de personnes utilisant les exceptions comme ifdéclarations! C'est certainement la bonne réponse
ILikeTacos
1
quel est le contenu de l'intention? la chaîne avec le packageName ne fonctionne pas
Henrique de Sousa
3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K
Si l'application a été désactivée, elle devrait être erronée.
Hugo le
15

Si vous connaissez le nom du package, cela fonctionne sans utiliser de bloc try-catch ni itérer dans un tas de packages:

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
la source
1
return !list.isEmpty();serait plus convivial de style java
headsvk
7

Ce code vérifie que l'application est installée, mais vérifie également qu'elle est activée.

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
la source
C'est le nom du package de l'application. Par exemple, "com.example.apps.myapp". J'ai modifié ma réponse pour afficher packageName au lieu de uri.
youravgjoe
3

Je pense que l'utilisation du modèle try / catch n'est pas très bonne pour les performances. Je conseille d'utiliser ceci:

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
la source
Le code ci-dessus dans 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

Solution plus propre (sans try-catch) que la réponse acceptée (basée sur 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;
}
Alexandre Savin
la source
2

Vérifiez que l'application est installée ou non dans Android en utilisant kotlin.

Création de l'extension kotlin.

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

Maintenant, peut vérifier si l'application est installée ou non

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}
Neeraj Dhameliya
la source
1

Essaye ça

Ce code est utilisé pour vérifier si votre application avec le nom du package est installée ou non sinon il ouvrira le lien Playstore de votre application sinon votre application installée

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
la source
1

Une implémentation plus simple avec Kotlin

fun PackageManager.isAppInstalled(packageName: String): Boolean =
        getInstalledApplications(PackageManager.GET_META_DATA)
                .firstOrNull { it.packageName == packageName } != null

Et appelez-le comme ceci (à la recherche de l'application Spotify):

packageManager.isAppInstalled("com.spotify.music")
Víctor Albertos
la source
0

Réponse de @Egemen Hamutçu dans 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
la source
0

Toutes les réponses vérifient uniquement que certaines applications sont installées ou non. Mais, comme nous le savons tous, une application peut être installée mais désactivée par l'utilisateur, inutilisable.

Par conséquent, cette solution vérifie les deux. c'est-à-dire, les applications installées ET activées .

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

Appelez la méthode isPackageInstalled():

boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());

Maintenant, utilisez la variable booléenne isAppInstalledet faites ce que vous voulez.

if(isAppInstalled ) {
    /* do whatever you want */
}
Aashish
la source
0

Une bonne réponse à d'autres problèmes. Si vous ne voulez pas différencier "com.myapp.debug" et "com.myapp.release" par exemple!

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
la source
0

Tellement mieux avec Kotlin Suger:

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
David
la source