2012-10-02 15 views
10

Trabajo en una aplicación en la que quiero presentarle al usuario todas las aplicaciones instaladas y dejar que elija una y luego hacer algo con ella. Seguí un tutorial (esto: http://impressive-artworx.de/2011/list-all-installed-apps-in-style/) aunque tengo algunos problemas. Después de seguir el tutorial, solo obtuve aplicaciones que no estaban preinstaladas (como todas las aplicaciones en segundo plano que no se pueden abrir), que es genial si quieres las aplicaciones que el usuario ha descargado de Play Store. El problema es que en mi aplicación quiero mostrar las aplicaciones del sistema que se pueden abrir como Youtube y el navegador, pero no las que no se pueden abrir, como Search Application Provider.Filtrar aplicaciones que no se pueden abrir al obtener todas las aplicaciones instaladas

Aquí está el código que estoy usando cuándo obtener las aplicaciones:

private List<App> loadInstalledApps(boolean includeSysApps) { 
    List<App> apps = new ArrayList<App>(); 

    // the package manager contains the information about all installed apps 
    PackageManager packageManager = getPackageManager(); 

    List<PackageInfo> packs = packageManager.getInstalledPackages(0); //PackageManager.GET_META_DATA 

    for(int i=0; i < packs.size(); i++) { 
    PackageInfo p = packs.get(i); 
    ApplicationInfo a = p.applicationInfo; 

    App app = new App(); 
    app.setTitle(p.applicationInfo.loadLabel(packageManager).toString()); 
    app.setPackageName(p.packageName); 
    app.setVersionName(p.versionName); 
    app.setVersionCode(p.versionCode); 
    CharSequence description = p.applicationInfo.loadDescription(packageManager); 
    app.setDescription(description != null ? description.toString() : ""); 
    apps.add(app); 
    } 
    return apps; 
    } 

Ahora mi pregunta es; ¿Cuál es la mejor manera de filtrar las aplicaciones que no se pueden lanzar?

¡Se agradece cualquier ayuda!

Respuesta

25

La mejor manera es:

public static List<ApplicationInfo> getAllInstalledApplications(Context context) { 
    List<ApplicationInfo> installedApps = context.getPackageManager().getInstalledApplications(PackageManager.PERMISSION_GRANTED); 
    List<ApplicationInfo> launchableInstalledApps = new ArrayList<ApplicationInfo>(); 
    for(int i =0; i<installedApps.size(); i++){ 
     if(context.getPackageManager().getLaunchIntentForPackage(installedApps.get(i).packageName) != null){ 
      //If you're here, then this is a launch-able app 
      launchableInstalledApps.add(installedApps.get(i)); 
     } 
    } 
    return launchableInstalledApps; 
} 
+0

Esto no es una buena idea, ya que algunas aplicaciones vuelven nulo para getLaunchIntentForPackageName. Con esta solución tuve el problema de que la aplicación "Telefonía" no estaba en la lista de aplicaciones. Para una mejor solución, mira aquí: https://stackoverflow.com/a/30446616/4274651 – Janosch

Cuestiones relacionadas