Wie kann ich feststellen, ob auf meinem Android-Gerät ein bestimmtes Paket vorhanden ist?

71

Wie kann ich feststellen, ob com.android.abcauf meinem Android-Gerät ein bestimmtes Paket oder eine bestimmte Anwendung vorhanden ist?

Brigg
quelle

Antworten:

152

Rufen Sie eine der folgenden Methoden mit dem Paketnamen auf.

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;
 }
Rasel
quelle
Danke Rasel, ich habe nur danach gesucht. Vielen Dank.
Brigg
Was muss ich importieren, damit dies funktioniert? Ich bekomme einen cannot resolve symbol 'PackageManager'Fehler.
Oscar Swanros
Die zweite Methode ist schneller
Alex
13

Ohne einen Try-Catch-Block zu verwenden oder eine Reihe von Paketen zu durchlaufen:

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

Kotlin

fun isPackageExist(context: Context, target: String): Boolean {
     return context.packageManager.getInstalledApplications(0).find { info -> info.packageName == target } != null
}
Reza
quelle
4
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;
user3078812
quelle
3

Sie sollten die PackageManageraufgerufene Funktion verwenden getInstalledPackages(), um die Liste aller installierten Pakete abzurufen und nach dem zu suchen, an dem Sie interessiert sind. Beachten Sie, dass sich der Paketname im PackageInfo.packageNameFeld befindet.

inazaruk
quelle
2

Wenn Sie nur adb verwenden möchten:

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

Es werden alle installierten Pakete aufgelistet.

Iryna
quelle
2

Sie können pm.getPackageUid () verwenden, anstatt über pm.getInstalledApplications () zu iterieren.

 boolean isPackageInstalled;
 PackageManager pm = getPackageManager();   
 int flags = 0; 
        try 
        {   
              pm.getPackageUid(packageName,flags);               
              isPackageInstalled = true;    
        }   
        catch (final PackageManager.NameNotFoundException nnfe) 
        {   
            isPackageInstalled = false; 
        }                   
 return isPackageInstalled;
Gowtham
quelle
getPackageUid - Wurde jedoch in API-Level 24 hinzugefügt.
Goran Horia Mihail
1

Da einige Geräte gemeldet haben, dass "getInstalledPackages" eine TransactionTooLargeException verursachen kann (siehe hier , hier und hier ), sollten Sie auch einen Fallback haben, wie ich es unten getan habe.

Dieses Problem sollte auf Android 5.1 behoben werden (lesen Sie hier ), aber einige berichteten immer noch darüber.

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) {
    }
}
Android-Entwickler
quelle
1

Wir können dies überprüfen:

 if(getPackageManager().hasSystemFeature("android.software.webview") == true && isPackageExisted("com.google.android.webview")) {
            if (Constant.isNetworkConnected(Activity.this)) {
                 //Your Intent 
            } else {
                Toast.makeText(getApplicationContext(), resources.getString(R.string.internet_error), Toast.LENGTH_SHORT).show();
            }
        }   else
            {
                Constant.showDialog(Activity.this,"Please install the webview");
            }
    }

Methode zur Paketprüfung machen! Dieses Guthaben geht an "Kavi" https://stackoverflow.com/a/30708227/6209105

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;

}}

Shaikh Mohib
quelle