Android: cómo obtener una lista de actividades instaladas, tal como aparecen en el iniciador, sin duplicados

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. Usando tutoriales de stackoverflow, logré descubrir cómo obtener una lista de actividades instaladas, sus nombres de paquete e íconos (es decir,aqu - varias formas de hacerlo). Por si acaso, así es como comienzo las actividades, funciona perfectamente, no hay problema aquí:

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 recuperar una lista de aplicaciones instaladas. He encontrado dos formas de obtener una lista de aplicaciones instaladas:

1) usa

PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplication(PackageManager.GET_META_DATA) 

y de cada elemento deapps puede obtener el nombre del paquete y la etiqueta del paquete (nombres de la aplicación).

2) usa

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 conprimerétodo @: devuelve todos los paquetes instalados, incluidos los servicios del sistema, que pueden no contener ninguna actividad y, por lo tanto, no se pueden iniciar. Aquí hay una captura de pantalla con un ejemplo:

Todos los elementos anteriores que no tienen iconos no se pueden iniciar.

Hay un problema con lasegund enfoque también: varios elementos en la lista tienen duplicados:

Cuando configuro un punto de interrupción en el depurador, veo que estos elementos de "Maps" 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 proporciona una lista que es más adecuada para mis necesidades, pero no puedo encontrar una manera de filtrar los duplicados y solo mostrar la actividad predeterminada para la aplicación, tal como aparecen en el Iniciador (solo ve uno 'Mapas' en la lista de aplicaciones de su teléfono, no cuatro). He intentado filtrar las aplicaciones del sistema a través deApplicationInfo.FLAG_SYSTEM, pero esto elimina muchas aplicaciones que quiero tener, incluidos Maps y otras aplicaciones preinstaladas. He intentado usarPackageManager.MATCH_DEFAULT_ONLY flag 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 en stackoverflow sobre la recuperación de una lista de aplicaciones instaladas, pero este problema nunca se ha mencionado. Por favor, ayuda a alguien? ¿Cómo recupero una lista de aplicaciones ejecutables instaladas que no tiene duplicados?

Respuestas a la pregunta(0)

Su respuesta a la pregunta