web-dev-qa-db-fra.com

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

Nous avons installé des applications par programme.

  1. Si l'application est déjà installée sur le périphérique, elle est ouverte automatiquement.
  2. Sinon, installez l'application particulière.

Guide moi. Je n'en ai aucune idée ... Merci.

132
Sathish Sathish

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

}
292
Aerrow

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 placer dans une classe d'aide en tant qu'utilitaire statique. Exemple d'utilisation:

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

Cette réponse montre comment obtenir l'application du Play Store si celle-ci est manquante, même si des précautions doivent être prises sur les appareils ne disposant pas du Play Store.

57
Jonik

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

Créez un objet d'intention avec les informations appropriées, puis vérifiez si l'intention 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;  
}
25
Priyank Desai

Si vous connaissez le nom du paquet, alors cela fonctionne sans utiliser de bloc try-catch ni parcourir plusieurs paquets:

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();
}
14
Kavi

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

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;
}
3
Alexander Savin

Je pense que l’utilisation du motif try/catch n’est pas très bonne pour la performance. Je conseil 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;
}
2
Egemen Hamutçu

Essaye ça

Ce code est utilisé pour vérifier si votre application a le nom du paquet installé ou pas 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 );
    }
1
Sunil

Une mise en oeuvre 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 (recherche de l'application Spotify):

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

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;
}
0
Nicolas Duponchel

La réponse de @Egemen Hamutçu en 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()
    }
0
Kishan B

Toutes les réponses vérifient seulement que l'application est installée 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 des 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 isAppInstalled et faites ce que vous voulez.

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