web-dev-qa-db-fra.com

Comment savoir si un package particulier existe sur mon appareil Android?

Comment savoir si un package ou une application spécifique, par exemple: com.Android.abc, existe sur mon appareil Android?

60
brig

Appelez l'une des méthodes ci-dessous avec le nom du package.

import Android.content.pm.PackageManager;

// ...

    public boolean isPackageExisted(String targetPackage){
        List<ApplicationInfo> packages;
        PackageManager pm;

        pm = getPackageManager();        
        packages = pm.getInstalledApplications(0);
        for (ApplicationInfo packageInfo : packages) {
            if(packageInfo.packageName.equals(targetPackage))
                return true;
        }
        return false;
    }

 import Android.content.pm.PackageManager;

 public boolean isPackageExisted(String targetPackage){
   PackageManager pm=getPackageManager();
   try {
     PackageInfo info=pm.getPackageInfo(targetPackage,PackageManager.GET_META_DATA);
   } catch (PackageManager.NameNotFoundException e) {
     return false;
   }  
   return true;
 }
134
Rasel

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.size() > 0;
}
7
Kavi
Intent intent = new Intent("com.google.zxing.client.Android.SCAN");
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;
4
user3078812

Vous devez utiliser la fonction PackageManager appelée getInstalledPackages() pour obtenir la liste de tous les packages installés et la recherche de celui qui vous intéresse. Notez que le nom du package est situé dans le champ PackageInfo.packageName .

3
inazaruk

Si vous voulez juste utiliser adb:

adb Shell "pm list packages"|cut -f 2 -d ":"

il listera tous les paquets installés.

2
Iryna

Kotlin

fun isPackageExist(context: Context, target: String): Boolean {
     return context.packageManager.getInstalledApplications(0).find { info -> info.packageName == target } != null
}
1
Reza

Certains périphériques ayant signalé que les "getInstalledPackages" peuvent provoquer une exception TransactionTooLargeException (vérifiez ici , ici et ici ), je pense que vous devriez aussi avoir un repli comme je l'ai fait ci-dessous.

Ce problème était censé être résolu sous Android 5.1 (lire ici ), mais certains en ont encore fait rapport.

public static List<String> getInstalledPackages(final Context context) {
    List<String> result = new ArrayList<>();
    final PackageManager pm = context.getPackageManager();
    try {
        List<PackageInfo> apps = pm.getInstalledPackages(0);
        for (PackageInfo packageInfo : apps)
            result.add(packageInfo.packageName);
        return result;
    } catch (Exception ignored) {
        //we don't care why it didn't succeed. We'll do it using an alternative way instead
    }
    // use fallback:
    BufferedReader bufferedReader = null;
    try {
        Process process = Runtime.getRuntime().exec("pm list packages");
        bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            final String packageName = line.substring(line.indexOf(':') + 1);
            result.add(packageName);
        }
        closeQuietly(bufferedReader);
        process.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        closeQuietly(bufferedReader);
    }
    return result;
}

public static void closeQuietly(final Closeable closeable) {
    if (closeable == null)
        return;
    try {
        closeable.close();
    } catch (final IOException e) {
    }
}
1
android developer

Vous pouvez utiliser pm.getPackageUid () au lieu de parcourir le pm.getInstalledApplications ()

 boolean isPackageInstalled;
 PackageManager pm = getPackageManager();   
 int flags = 0; 
        try 
        {   
              pm.getPackageUid(packageName,flags);               
              isPackageInstalled = true;    
        }   
        catch (final PackageManager.NameNotFoundException nnfe) 
        {   
            isPackageInstalled = false; 
        }                   
 return isPackageInstalled;
0
Gowtham