Come ottenere un elenco di applicazioni Android installate e sceglierne una da eseguire


326

Ho fatto una domanda simile a questa all'inizio di questa settimana, ma non riesco ancora a capire come ottenere un elenco di tutte le applicazioni installate e quindi sceglierne una da eseguire.

Ho provato:

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

e questo mostra solo le applicazioni preinstallate o che possono eseguire il ACTION_MAINtipo Intent.

So anche che posso usare PackageManagerper ottenere tutte le applicazioni installate, ma come posso usarlo per eseguire un'applicazione specifica?


Come è possibile ottenere solo le informazioni sull'app selezionata nell'elenco?
Pedrum,

Risposte:


277

Di seguito è riportato il codice per ottenere l'elenco di attività / applicazioni installate su Android:

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

Riceverai tutti i dati necessari nel ResolveInfoper avviare un'applicazione. Puoi controllare ResolveInfojavadoc qui .


3
Come posso iniziare uno di questi? L'attivitàInfo è stata inserita in ResolveInfo, ma non riesco a avviarla.
Spidey,

1
Non importa, l'ho trovato. Dovrei creare un nuovo intento usando il nome completo della classe (pacchetto + classe).
Spidey,

Come è possibile ottenere solo le informazioni sull'app selezionata nell'elenco?
Pedrum,

1
Volevo capire la politica di Android / Play Store sulla mia app per leggere e archiviare un elenco di tutte le app e potenzialmente comunicare con un server. Ci sono delle linee guida?
dowjones123,

1
@ dowjones123 Ti è capitato di trovare le linee guida in merito?
RmK

415

Ecco un modo più pulito usando il 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() 

Maggiori informazioni qui http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/


Funziona gr8. Ma quando ho provato questo su Android 4.0.3, nulla viene stampato !! Qualche idea ??
Saurabh Verma,

Assicurarsi di non filtrare le istruzioni del registro di debug.
QED

Questo codice funziona comunque, hai qualche idea su come mettere quell'elenco di applicazioni in un ListView?
android Boomer

@androidBoomer sto facendo lo stesso. leggi qui - vogella.com/tutorials/AndroidListView/article.html
David T.

@DavidT. L'ho già capito. Ora sto lavorando su come posso accedere a quell'app installata per creare un collegamento all'interno della mia app. È possibile?
androidBoomer

61

Un altro modo per filtrare le app di sistema (funziona con l'esempio di 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);
}

4
Questa è la risposta migliore per filtrare le app di sistema.
Bjorn,

5
Ma io filtra le applicazioni come impostazioni, mappe o ..., come elencarle anch'esse
Ata,

7
La parte "? True: false" della dichiarazione di
reso

semplifica return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani,

come filtrare le app a pagamento?
Pemba Tamang,

55

Ecco un buon esempio:

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

1
Come si esegue uno di quelli se è necessario? Voglio dire, puoi ottenere l'intento?
Ton

Grande. Grazie per la tua risposta. Ho usato la tua risposta nella mia domanda e ho un piccolo problema con la dimensione dell'icona. la maggior parte di essi è normale e alcuni sono molto grandi o piccoli. Come posso ripararlo. Hai qualche idea? grazie
Meysam Valueian il

37

Elenco delle app non di sistema installate

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

19

Per filtrare le app basate su sistema:

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

18

Per ottenere tutte le app installate è possibile utilizzare Gestione pacchetti.

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

Per eseguire è possibile utilizzare il nome del pacchetto

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

Per maggiori dettagli puoi leggere questo blog http://codebucket.co.in/android-get-list-of-all-installed-apps/


Questo è più al punto. Possiamo impostare un controllo adeguato scoprendo la nostra app richiesta.
Noman,

13

Puoi trovare l'elenco delle app installate nel dispositivo Android utilizzando il codice seguente, "packageInfo" contiene le informazioni sull'applicazione installata nel dispositivo. possiamo recuperare Intento per l'applicazione installata dall'oggetto packageinfo e usando startactivity (intento), possiamo avviare l'applicazione. dipende da te come organizzare l'interfaccia utente o Listview o Gridview. quindi all'evento clic in base alla posizione, è possibile recuperare l'oggetto intento e avviare l'intento dell'attività.

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

}
}

13

Avevo l'obbligo di filtrare le app di sistema che l'utente non utilizza realmente (ad es. "Com.qualcomm.service", "servizi di aggiornamento", ecc.). Alla fine ho aggiunto un'altra condizione per filtrare l'elenco delle app. Ho appena verificato se l'app ha "intento di avvio".

Quindi, il codice risultante sembra ...

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

        }

Grazie. GetLaunchIntentForPackage è molto utile per ottenere le app presenti in App Drawer :-)
Gabriel Hautclocq

10

Se ci sono più lanciatori in un pacchetto sopra il codice ha un problema. Ad esempio: su LG Optimus Facebook per LG, MySpace per LG, Twitter per LG contiene in un unico pacchetto il nome SNS e se si utilizza sopra SNS si ripeterà. Dopo ore di ricerca sono arrivato con il seguente codice. Sembra funzionare bene.

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

7

@Jas: non ho più quel codice, ma ho trovato qualcosa di simile. L'ho fatto per cercare "componenti" della mia applicazione, sono solo attività con una determinata categoria.

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

Ho commentato la parte in cui ottiene il nome dell'attività, ma è piuttosto semplice.


6

Soluzione pulita che filtra con successo le app di sistema

L'idea alla base di questa soluzione è che l'attività principale di ogni app di sistema non ha un'icona di attività personalizzata . Questo metodo mi dà un risultato eccellente:

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

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

2

Ho un'altra soluzione:

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

2

Ottieni tutte le app:

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

Verifica se l'app installata è aperta:

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

0

puoi usare questo:

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

0
public static List<ApplicationInfo> getApplications(Context context) {
    return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.