Comment obtenir une liste des applications Android installées et en choisir une à exécuter

326

J'ai posé une question similaire à celle-ci plus tôt cette semaine, mais je ne comprends toujours pas comment obtenir une liste de toutes les applications installées, puis en choisir une à exécuter.

J'ai essayé:

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

et cela ne montre que les applications préinstallées ou qui peuvent exécuter le ACTION_MAINtype d'intention.

Je sais également que je peux utiliser PackageManagerpour obtenir toutes les applications installées, mais comment l'utiliser pour exécuter une application spécifique?

2Real
la source
Comment pouvez-vous uniquement obtenir les informations sur l'application sélectionnée dans la liste?
Pedrum

Réponses:

277

Voici le code pour obtenir la liste des activités / applications installées sur Android:

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

Vous obtiendrez toutes les données nécessaires dans le ResolveInfopour démarrer une application. Vous pouvez vérifier ResolveInfojavadoc ici .

Karan
la source
3
Comment puis-je en démarrer un? J'ai obtenu l'activitéInfo dans ResolveInfo, mais je n'arrive pas à le démarrer.
Spidey
1
Peu importe, je l'ai trouvé. Je devrais créer une nouvelle intention en utilisant le nom complet de la classe (package + classe).
Spidey
Comment pouvez-vous uniquement obtenir les informations sur l'application sélectionnée dans la liste?
Pedrum
1
Je voulais comprendre la politique d'Android / Play Store concernant la lecture de mon application et le stockage d'une liste de toutes les applications, et éventuellement la communication avec un serveur. Y a-t-il des directives?
dowjones123
1
@ dowjones123 Avez-vous trouvé des directives à ce sujet?
RmK
415

Voici une façon plus propre d'utiliser le 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() 

Plus d'informations ici http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/

Nelson Ramirez
la source
Fonctionne gr8. Mais lorsque vous avez essayé cela sur Android 4.0.3, rien ne s'imprime !! Un indice ??
Saurabh Verma
Assurez-vous que vous ne filtrez pas les instructions de journal de débogage.
QED
Ce code fonctionne cependant, avez-vous une idée sur la façon de mettre cette liste d'applications dans un ListView?
androidBoomer
@androidBoomer im faisant de même. lire ceci ici - vogella.com/tutorials/AndroidListView/article.html
David T.
@DavidT. Je l'ai déjà compris. Maintenant, je travaille sur la façon d'accéder à ces applications installées afin de créer un raccourci dans mon application. Est-ce possible?
androidBoomer
61

Une autre façon de filtrer les applications système (fonctionne avec l'exemple de 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
la source
4
C'est la meilleure réponse pour filtrer les applications système.
Bjorn
5
Mais je filtre les appliactions comme les paramètres, les cartes ou ..., comment les lister aussi
Ata
7
La partie "? True: false" de votre déclaration de retour est redondante
k2col
simplifier le retour ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani
comment filtrer les applications payantes?
Pemba Tamang
55

Voici un bon exemple:

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
la source
1
Comment exécutez-vous l'un de ceux-ci si vous en avez besoin? Je veux dire, pouvez-vous obtenir l'intention?
Ton
Génial. Merci pour votre réponse. J'ai utilisé votre réponse dans ma candidature et j'ai un petit problème avec la taille de l'icône. la plupart d'entre eux sont normaux et certains sont très grands ou petits. Comment puis-je résoudre ce problème. Avez-vous une idée? merci
Meysam Valueian
37

Obtention de la liste des applications non système installées

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

Pour filtrer sur les applications basées sur le système:

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

Pour obtenir toutes les applications installées, vous pouvez utiliser le Gestionnaire de packages.

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

Pour exécuter, vous pouvez utiliser le nom du package

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

Pour plus de détails, vous pouvez lire ce blog http://codebucket.co.in/android-get-list-of-all-installed-apps/

Arvind
la source
C'est plus pertinent. Nous pouvons définir un contrôle approprié en découvrant notre application requise.
Noman
13

Vous pouvez trouver la liste des applications installées dans l'appareil Android en utilisant le code ci-dessous, "packageInfo" contient les informations sur les applications installées dans l'appareil. nous pouvons récupérer Intent pour l'application installée à partir de l'objet packageinfo et en utilisant startactivity (intention), nous pouvons démarrer l'application. c'est à vous de décider comment organiser l'interface utilisateur, soit Listview ou Gridview. ainsi, sur un événement de clic basé sur la position, vous pouvez récupérer l'objet d'intention et démarrer l'intention d'activité.

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

J'avais besoin de filtrer les applications système que l'utilisateur n'utilise pas vraiment (par exemple, "com.qualcomm.service", "update services", etc.). Finalement, j'ai ajouté une autre condition pour filtrer la liste des applications. Je viens de vérifier si l'application a une «intention de lancement».

Ainsi, le code résultant ressemble à ...

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
la source
Merci. Le getLaunchIntentForPackage est très utile pour obtenir les applications présentes dans le tiroir d'applications :-)
Gabriel Hautclocq
10

S'il y a plusieurs lanceurs dans un seul package ci-dessus, le code présente un problème. Par exemple: sur LG Optimus Facebook pour LG, MySpace pour LG, Twitter pour LG contient un seul nom de package SNS et si vous utilisez ci-dessus, SNS se répétera. Après des heures de recherche, je suis venu avec le code ci-dessous. Semble bien fonctionner.

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

@Jas: Je n'ai plus ce code, mais j'ai trouvé quelque chose de proche. Je l'ai fait pour rechercher des "composants" de mon application, ce ne sont que des activités avec une catégorie donnée.

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

J'ai commenté la partie où il obtient le nom de l'activité, mais c'est assez simple.

Spidey
la source
6

Solution propre qui filtre avec succès les applications système

L'idée derrière cette solution est que l'activité principale de chaque application système n'a pas d' icône d'activité personnalisée . Cette méthode me donne un excellent résultat:

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

J'ai une autre solution:

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.
la source
2

Obtenez toutes les applications:

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

Vérifiez si l'application installée puis ouvrez:

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

vous pouvez utiliser ceci:

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
la source
0
public static List<ApplicationInfo> getApplications(Context context) {
    return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}
Reza
la source