Estuve trabajando en algo como esto recientemente. Una cosa que diré por adelantado es estar seguro y realizar esto en un hilo separado: consultar la información de la aplicación es LENTO. A continuación, obtendrá una lista de TODAS las aplicaciones instaladas. Esto incluirá una gran cantidad de aplicaciones del sistema que probablemente no está interesado en.
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(0);
limitarlo a solo las aplicaciones del sistema actualizado, instalado por el usuario o (por ejemplo, mapas, Gmail, etc), que utilizan el siguiente lógica:
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: Además, para obtener el nombre y el icono de la aplicación (que es probablemente lo que toma más tiempo - no he hecho ninguna inspección de bienes profunda en él - se usa:
String label = (String)pm.getApplicationLabel(app);
Drawable icon = pm.getApplicationIcon(app);
insta lledApps debería tener una lista completa de las aplicaciones que necesitas, ahora. Espero que esto ayude, pero puede que tenga que modificar la lógica un poco dependiendo de qué aplicaciones necesite devolver. Una vez más, es LENTO, pero es algo en lo que tienes que trabajar. Es posible que desee construir un caché de datos en una base de datos si es algo a lo que accederá con frecuencia.
Muchas cosas, pero nada que no forzar cerrar o darme errores el método aparentemente devuelve una lista de matrices, pero siendo nuevo en esto no sé cómo mostrar eso en una lista en la pantalla como una lista de vista – user577732