Estoy escribiendo una aplicación que permite al usuario ver la lista de aplicaciones instaladas, seleccionar una de ellas y luego iniciarla según lo programado. Utilizando tutoriales de stackoverflow logré descubrir cómo obtener una lista de las actividades instaladas, sus nombres de paquetes e íconos (es decir, here - varias formas de hacerlo). Por si acaso, así es como empiezo actividades, funciona perfectamente, no hay problema aquí:Android: Cómo obtener una lista de actividades instaladas, tal como aparecen en el iniciador, sin duplicados
Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
launchIntent.setAction(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(launchIntent);
El problema es con la recuperación de una lista de aplicaciones instaladas. He encontrado dos formas de obtener una lista de aplicaciones instaladas:
1) el uso
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplication(PackageManager.GET_META_DATA)
y desde cada elemento de apps
, usted puede obtener es el nombre del paquete y la etiqueta del envase (nombres de aplicaciones).
2) el uso
PackageManager pm = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(mainIntent, 0);
for(ResolveInfo info : resolveInfos) {
ApplicationInfo applicationInfo = info.activityInfo.applicationInfo;
//...
//get package name, icon and label from applicationInfo object
}
Hay un problema con primera método: devuelve todos los paquetes instalados, incluyendo los servicios del sistema, que pueden no contienen ninguna actividad y por lo tanto no son launchable. Aquí hay una captura de pantalla con un ejemplo:
Todos los elementos anteriores que no tienen iconos no se pueden abrir.
Hay un problema con el enfoque segundo así: Varios elementos de la lista tienen duplicados:
Al configurar un punto de interrupción en el depurador que veo, que estos elementos "Mapas" tienen diferentes nombres de actividad ("com.google.android.maps.MapsActivity", "com.google.android.maps.LatitudeActivity", "com.google.android.maps.PlacesActivity", etc.).
Decidí usar el segundo enfoque, porque da una lista que es más adecuada para mis necesidades, pero no puedo encontrar una forma de filtrar los duplicados y solo mostrar la actividad predeterminada para la aplicación, ya que aparecer en el Iniciador (solo ve un 'Mapas' en la lista de aplicaciones de su teléfono, no cuatro). Intenté filtrar las aplicaciones del sistema a través del ApplicationInfo.FLAG_SYSTEM
, pero esto elimina muchas aplicaciones que quiero tener, incluidos Maps y otras aplicaciones preinstaladas. Intenté usar el indicador PackageManager.MATCH_DEFAULT_ONLY
al ejecutar queryIntentActivities, pero esto también filtra muchas aplicaciones, dejando solo algunas.
Estoy un poco perdido aquí, y no sé qué hacer. He leído todas las preguntas sobre stackoverflow sobre cómo recuperar una lista de aplicaciones instaladas, pero este problema nunca se ha planteado. Por favor, ayuda a alguien? ¿Cómo recupero una lista de aplicaciones iniciables instaladas que no tiene duplicados?
Usted dice que "este tema nunca ha sido criado". Por favor revise esto, tal vez esto ayude: http://stackoverflow.com/questions/4598769/list-of-user-installed-apps/4599124#4599124 – Zelimir
Quise decir duplicados en la lista, no he visto a nadie mencionar esto. Sí, he visto ese comentario, he intentado omitir aplicaciones con 'ApplicationInfo.FLAG_SYSTEM', pero por alguna razón esto elimina muchas aplicaciones válidas, incluidos juegos y tal. –