Stavo lavorando a qualcosa di simile di recente. Una cosa che dirò in anticipo è per essere sicuro ed eseguire questo in un thread separato - interrogando le informazioni dell'applicazione è SLOW. Quanto segue ti fornirà un elenco di TUTTE le applicazioni installate. Ciò includerà un sacco di applicazioni di sistema che probabilmente non interessa.
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(0);
di limitarla a solo le applicazioni installate dall'utente o di sistema aggiornato (ad esempio programmi, Gmail, ecc), ho usato il seguente logica:
List<ApplicationInfo> installedApps = new ArrayList<ApplicationInfo>();
for(ApplicationInfo app : apps) {
//checks for flags; if flagged, check if updated system app
if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
installedApps.add(app);
//it's a system app, not interested
} else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
//Discard this one
//in this case, it should be a user-installed app
} else {
installedApps.add(app);
}
}
EDIT: Inoltre, per ottenere il nome e l'icona per l'applicazione (che è probabilmente quello che prende il più lungo - non ho fatto alcun reale ispezione approfondita su di esso - utilizzare questo:
String label = (String)pm.getApplicationLabel(app);
Drawable icon = pm.getApplicationIcon(app);
insta lledApps dovrebbe avere un elenco completo delle app di cui hai bisogno, ora. Spero che questo aiuti, ma potrebbe essere necessario modificare la logica un po 'a seconda di quali app devono essere restituite. Di nuovo, è LENTO, ma è solo qualcosa che devi risolvere. Potresti voler costruire una cache di dati in un database se è qualcosa a cui accedi frequentemente.
Un sacco di cose ma nulla che non forzasse o mi desse errori il metodo apparentemente restituisce un arraylist ma essendo nuovo a questo non so come visualizzarlo in una lista sullo schermo come una vista elenco – user577732