So erhalten Sie eine Liste der installierten Android-Anwendungen und wählen eine aus, die ausgeführt werden soll

325

Ich habe Anfang dieser Woche eine ähnliche Frage gestellt, aber ich verstehe immer noch nicht, wie ich eine Liste aller installierten Anwendungen abrufen und dann eine zum Ausführen auswählen kann.

Ich habe es versucht:

Intent intent = new Intent(ACTION_MAIN);
intent.addCategory(CATEGORY_LAUNCHER);

Dies zeigt nur Anwendungen an, die vorinstalliert sind oder den ACTION_MAINIntent-Typ ausführen können .

Ich weiß auch, dass ich PackageManageralle installierten Anwendungen abrufen kann, aber wie verwende ich dies, um eine bestimmte Anwendung auszuführen?

2Real
quelle
Wie können Sie nur die Informationen über die ausgewählte App in der Liste erhalten?
Pedrum

Antworten:

277

Im Folgenden finden Sie den Code zum Abrufen der Liste der auf Android installierten Aktivitäten / Anwendungen:

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);

Sie erhalten alle notwendigen Daten ResolveInfo, um eine Anwendung zu starten. Sie können ResolveInfoJavadoc hier überprüfen .

Karan
quelle
3
Wie kann ich eine davon starten? Ich habe die activityInfo in ResolveInfo, kann sie aber nicht starten.
Spidey
1
Vergiss es. Ich sollte eine neue Absicht mit dem vollständigen Klassennamen (Paket + Klasse) erstellen.
Spidey
Wie können Sie nur die Informationen über die ausgewählte App in der Liste erhalten?
Pedrum
1
Ich wollte die Android / Play Store-Richtlinie verstehen, nach der meine App eine Liste aller Apps liest und speichert und möglicherweise mit einem Server kommuniziert. Gibt es Richtlinien?
Dowjones123
1
@ dowjones123 Hast du zufällig die Richtlinien dazu gefunden?
RmK
415

Hier ist ein sauberer Weg mit dem PackageManager

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
    Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); 
}
// the getLaunchIntentForPackage returns an intent that you can use with startActivity() 

Weitere Infos hier http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/

Nelson Ramirez
quelle
Funktioniert gr8. Aber wenn dies unter Android 4.0.3 versucht wird, wird nichts gedruckt !! Irgendeine Ahnung ??
Saurabh Verma
Stellen Sie sicher, dass Sie keine Debug-Protokollanweisungen herausfiltern.
QED
Dieser Code funktioniert jedoch. Haben Sie eine Idee, wie Sie diese Anwendungsliste in eine ListView einfügen können?
AndroidBoomer
@androidBoomer Ich mache das gleiche. Lesen Sie dies hier - vogella.com/tutorials/AndroidListView/article.html
David T.
@ DavidT. Ich habe es bereits herausgefunden. Jetzt arbeite ich daran, wie ich auf diese installierte App zugreifen kann, um eine Verknüpfung in meiner App zu erstellen. Ist das möglich?
AndroidBoomer
61

Eine andere Möglichkeit, nach System-Apps zu filtern (funktioniert am Beispiel von king9981):

/**
 * Return whether the given PackageInfo represents a system package or not.
 * User-installed packages (Market or otherwise) should not be denoted as
 * system packages.
 * 
 * @param pkgInfo
 * @return
 */
private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}
Kenneth Evans
quelle
4
Dies ist die beste Antwort zum Herausfiltern von System-Apps.
Björn
5
Aber ich filtere keine Anwendungen wie Einstellungen, Karten oder ..., wie man sie auch auflistet
Ata
7
Der "? True: false" Teil Ihrer return-Anweisung ist überflüssig
k2col
Vereinfachung der Rückgabe ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani
Wie filtere ich kostenpflichtige Apps?
Pemba Tamang
55

Hier ein gutes Beispiel:

class PInfo {
    private String appname = "";
    private String pname = "";
    private String versionName = "";
    private int versionCode = 0;
    private Drawable icon;
    private void prettyPrint() {
        Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode);
    }
}

private ArrayList<PInfo> getPackages() {
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
    final int max = apps.size();
    for (int i=0; i<max; i++) {
        apps.get(i).prettyPrint();
    }
    return apps;
}

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
    ArrayList<PInfo> res = new ArrayList<PInfo>();        
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
    for(int i=0;i<packs.size();i++) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        PInfo newInfo = new PInfo();
        newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
        newInfo.pname = p.packageName;
        newInfo.versionName = p.versionName;
        newInfo.versionCode = p.versionCode;
        newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
        res.add(newInfo);
    }
    return res; 
}
king9981
quelle
1
Wie führen Sie eine davon aus, wenn Sie müssen? Ich meine, kannst du die Absicht bekommen?
Ton
Großartig. Danke für deine Antwort. Ich habe Ihre Antwort in meiner Bewerbung verwendet und habe ein kleines Problem mit der Größe des Symbols. Die meisten von ihnen sind normal und einige von ihnen sind sehr groß oder klein. Wie kann ich das beheben? Hast du irgendeine Idee? danke
Meysam Valueian
36

Liste der installierten Nicht-System-Apps abrufen

public static void installedApps()
{
    List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
    for (int i=0; i < packList.size(); i++)
    {
        PackageInfo packInfo = packList.get(i);
        if (  (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
        {
            String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
            Log.e("App № " + Integer.toString(i), appName);
        }
    }
}
XXX
quelle
19

So filtern Sie nach systembasierten Apps:

private boolean isSystemPackage(ResolveInfo ri) {
    return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}
SamCsharpAs3
quelle
18

Um alle installierten Apps zu erhalten, können Sie den Paket-Manager verwenden.

    List<PackageInfo> apps = getPackageManager().getInstalledPackages(0);

Zum Ausführen können Sie den Paketnamen verwenden

Intent launchApp = getPackageManager().getLaunchIntentForPackage(“package name”)
startActivity(launchApp);

Weitere Informationen finden Sie in diesem Blog unter http://codebucket.co.in/android-get-list-of-all-installed-apps/.

Arvind
quelle
Das ist mehr auf den Punkt. Wir können eine ordnungsgemäße Überprüfung durchführen, indem wir unsere erforderliche App herausfinden.
Noman
13

Sie können die Liste der auf dem Android-Gerät installierten Apps mithilfe des folgenden Codes finden: "packageInfo" Enthält Informationen zur installierten Anwendung auf dem Gerät. Wir können Intent für die vom packageinfo-Objekt installierte Anwendung abrufen und mithilfe von startactivity (intent) die Anwendung starten. Es liegt an Ihnen, wie Sie die Benutzeroberfläche entweder Listview oder Gridview organisieren. Wenn Sie also auf ein Ereignis basierend auf der Position klicken, können Sie das Absichtsobjekt abrufen und die Aktivitätsabsicht starten.

final PackageManager pm = getPackageManager();

List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);


for (ApplicationInfo packageInfo : packages) 

{
 if(pm.getLaunchIntentForPackage(packageInfo.packageName)!= null &&   

                   !pm.getLaunchIntentForPackage(packageInfo.packageName).equals(""))


{

    System.out.println("Package Name :" + packageInfo.packageName);

    System.out.println("Launch Intent For Package :"   +  
                  pm.getLaunchIntentForPackage(packageInfo.packageName));

    System.out.println("Application Label :"   + pm.getApplicationLabel(packageInfo));

    System.out.println("Application Label :"   + 
                           pm.getApplicationIcon(packageInfo.packageName).toString());

    System.out.println("i : "+i);

    /*if(i==2)

    {
         startActivity(pm.getLaunchIntentForPackage(packageInfo.packageName));

     break;

    }*/

    i++;

}
}
Prashant Agrawal
quelle
13

Ich musste die System-Apps herausfiltern, die der Benutzer nicht wirklich verwendet (z. B. "com.qualcomm.service", "update services" usw.). Letztendlich habe ich eine weitere Bedingung hinzugefügt, um die App-Liste herauszufiltern. Ich habe gerade überprüft, ob die App "Launcher Intent" hat.

Der resultierende Code sieht also so aus ...

PackageManager pm = getPackageManager();
        List<ApplicationInfo> apps = pm.getInstalledApplications(PackageManager.GET_GIDS);

        for (ApplicationInfo app : apps) {
            if(pm.getLaunchIntentForPackage(app.packageName) != null) {
                // apps with launcher intent
                if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
                    // updated system apps

                } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                    // system apps

                } else {
                    // user installed apps

                }
                appsList.add(app);
            }

        }
Joecizac
quelle
Vielen Dank. Das getLaunchIntentForPackage ist sehr nützlich, um die Apps in der App Drawer zu präsentieren :-)
Gabriel Hautclocq
10

Wenn sich in einem Paket mehrere Starter befinden, hat der obige Code ein Problem. Beispiel: Auf LG Optimus enthält Facebook für LG, MySpace für LG, Twitter für LG in einem Paket den Namen SNS und wenn Sie oben verwenden, wird SNS wiederholt. Nach stundenlanger Recherche kam ich mit folgendem Code. Scheint gut zu funktionieren.

private List<String> getInstalledComponentList()
            throws NameNotFoundException {
        final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> ril = getPackageManager().queryIntentActivities(mainIntent, 0);
        List<String> componentList = new ArrayList<String>();
        String name = null;

        for (ResolveInfo ri : ril) {
            if (ri.activityInfo != null) {
                Resources res = getPackageManager().getResourcesForApplication(ri.activityInfo.applicationInfo);
                if (ri.activityInfo.labelRes != 0) {
                    name = res.getString(ri.activityInfo.labelRes);
                } else {
                    name = ri.activityInfo.applicationInfo.loadLabel(
                            getPackageManager()).toString();
                }
                componentList.add(name);
            }
        }
        return componentList;
    }
Kakopappa
quelle
7

@Jas: Ich habe diesen Code nicht mehr, aber ich habe etwas in der Nähe gefunden. Ich habe dies gemacht, um nach "Komponenten" meiner Anwendung zu suchen. Es handelt sich lediglich um Aktivitäten mit einer bestimmten Kategorie.

private List<String> getInstalledComponentList() {
    Intent componentSearchIntent = new Intent();
    componentSearchIntent.addCategory(Constants.COMPONENTS_INTENT_CATEGORY);
    componentSearchIntent.setAction(Constants.COMPONENTS_INTENT_ACTION_DEFAULT);
    List<ResolveInfo> ril = getPackageManager().queryIntentActivities(componentSearchIntent, PackageManager.MATCH_DEFAULT_ONLY);
    List<String> componentList = new ArrayList<String>();
    Log.d(LOG_TAG, "Search for installed components found " + ril.size() + " matches.");
    for (ResolveInfo ri : ril) {
        if (ri.activityInfo != null) {
            componentList.add(ri.activityInfo.packageName);// + ri.activityInfo.name);
            Log.d(LOG_TAG, "Found installed: " + componentList.get(componentList.size()-1));
        }
    }
    return componentList;
}

Ich habe den Teil kommentiert, in dem der Aktivitätsname angezeigt wird, aber er ist ziemlich einfach.

Spidey
quelle
6

Saubere Lösung, die erfolgreich System-Apps herausfiltert

Die Idee hinter dieser Lösung ist, dass die Hauptaktivität jeder System-App kein benutzerdefiniertes Aktivitätssymbol hat . Diese Methode liefert mir ein hervorragendes Ergebnis:

 public static Set<PackageInfo> getInstalledApps(Context ctx) {
    final PackageManager packageManager = ctx.getPackageManager();

    final List<PackageInfo> allInstalledPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
    final Set<PackageInfo> filteredPackages = new HashSet();

    Drawable defaultActivityIcon = packageManager.getDefaultActivityIcon();

    for(PackageInfo each : allInstalledPackages) {
        if(ctx.getPackageName().equals(each.packageName)) {
            continue;  // skip own app
        }

        try {
            // add only apps with application icon
            Intent intentOfStartActivity = packageManager.getLaunchIntentForPackage(each.packageName);
            if(intentOfStartActivity == null)
                continue;

            Drawable applicationIcon = packageManager.getActivityIcon(intentOfStartActivity);
            if(applicationIcon != null && !defaultActivityIcon.equals(applicationIcon)) {
                filteredPackages.add(each);
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.i("MyTag", "Unknown package name " + each.packageName);
        }
    }

    return filteredPackages;
}
funcoder
quelle
3
private static boolean isThisASystemPackage(Context context, PackageInfo  packageInfo ) {
        try {
            PackageInfo sys = context.getPackageManager().getPackageInfo("android", PackageManager.GET_SIGNATURES);
            return (packageInfo != null && packageInfo.signatures != null &&
                    sys.signatures[0].equals(packageInfo.signatures[0]));
        } catch (NameNotFoundException e) {
            return false;
        }
    }
user1546570
quelle
2

Ich habe eine andere Lösung:

ArrayList<AppInfo> myAppsToUpdate;

    // How to get the system and the user apps.
    public ArrayList<AppInfo> getAppsToUpdate() {

        PackageManager pm = App.getContext().getPackageManager();
        List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
        myAppsToUpdate = new ArrayList<AppInfo>();
        for (ApplicationInfo aInfo : installedApps) {

            if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                // System apps 
            } else {
                // Users apps
                AppInfo appInfo = new AppInfo();
                appInfo.setAppName(aInfo.loadLabel(pm).toString());
                appInfo.setPackageName(aInfo.packageName);
                appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString());
                try {
                    PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0);
                    appInfo.setVersionName(info.versionName.toString());
                    appInfo.setVersionCode("" + info.versionCode);
                    myAppsToUpdate.add(appInfo);
                } catch (NameNotFoundException e) {
                    Log.e("ERROR", "we could not get the user's apps");
                }

            }
        }
        return myAppsToUpdate;
    }
Victor Ruiz.
quelle
2

Holen Sie sich alle Apps:

    PackageManager pm = getContext().getPackageManager();
    List<ApplicationInfo> apps = pm.getInstalledApplications(0);

Überprüfen Sie, ob die App installiert ist, und öffnen Sie sie:

if((app.flags & (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP | ApplicationInfo.FLAG_SYSTEM)) > 0) {
                String app_package = app.packageName;
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(app_package);
context.startActivity(launchIntent);
Chandra Agarwala
quelle
0

Sie können dies verwenden:

PackageManager pm = getApplicationContext().getPackageManager();
                List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
                for (final ResolveInfo app : activityList) 
                {
                   if ((app.activityInfo.name).contains("facebook")) 
                   {
                     // facebook  
                   }

                   if ((app.activityInfo.name).contains("android.gm")) 
                   {
                     // gmail  
                   }

                   if ((app.activityInfo.name).contains("mms")) 
                   {
                     // android messaging app
                   }

                   if ((app.activityInfo.name).contains("com.android.bluetooth")) 
                   {
                     // android bluetooth  
                   }
                }
Akshay Paliwal
quelle
0
public static List<ApplicationInfo> getApplications(Context context) {
    return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}
Reza
quelle