Android: Como obter uma lista de atividades instaladas, como aparecem no iniciador, sem duplicatas

Estou escrevendo um aplicativo que permite ao usuário visualizar a lista de aplicativos instalados, selecionar um deles e iniciá-lo conforme o planejado. Usando os tutoriais do stackoverflow, consegui descobrir como obter uma lista de atividades instaladas, seus nomes e ícones de pacotes (ou seja,aqu - várias maneiras de fazer isso). Apenas no caso, é assim que inicio as atividades, ele funciona perfeitamente, sem problemas aqui:

Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
launchIntent.setAction(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(launchIntent);

O problema está em recuperar uma lista de aplicativos instalados. Encontrei duas maneiras de obter uma lista de aplicativos instalados:

1) use

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

e de cada elemento deapps você pode obter o nome e o rótulo do pacote (nomes de aplicativos

2) use

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    
}

Há um problema comprimeir method: retorna todos os pacotes instalados, incluindo serviços do sistema, que podem não conter nenhuma atividade e, portanto, não podem ser ativados. Aqui está uma captura de tela com um exemplo:

Todos os itens acima que não têm ícones não podem ser ativado

Há um problema com osegund abordagem também: vários itens da lista têm duplicatas:

Quando configuro um ponto de interrupção no depurador, vejo que esses itens "Mapas" têm nomes de atividades diferentes ("com.google.android.maps.MapsActivity", "com.google.android.maps.LatitudeActivity", "com. google.android.maps.PlacesActivity "etc.).

Decidi usar a segunda abordagem, porque ela fornece uma lista mais adequada às minhas necessidades, mas não consigo encontrar uma maneira de filtrar as duplicatas e mostrar apenas a atividade padrão do aplicativo, como elas aparecem no Iniciador (você vê apenas um 'Mapas' na lista de aplicativos do seu telefone, não quatro). Tentei filtrar os aplicativos do sistema através deApplicationInfo.FLAG_SYSTEM, mas isso remove muitos aplicativos que eu quero ter, incluindo o Google Maps e outros aplicativos pré-instalados. Eu tentei usarPackageManager.MATCH_DEFAULT_ONLY sinaliza ao executar queryIntentActivities, mas isso também filtra muitos aplicativos, deixando apenas algun

Estou meio perdido aqui e não sei o que fazer. Li todas as perguntas no stackoverflow sobre a recuperação de uma lista de aplicativos instalados, mas esse problema nunca foi levantado. Por favor, ajude alguém? Como recupero uma lista de aplicativos iniciáveis instaláveis que não possuem duplicatas?

questionAnswers(0)

yourAnswerToTheQuestion