Android: как получить список установленных действий, как они отображаются в лаунчере, без дубликатов

Я пишу приложение, которое позволяет пользователю просматривать список установленных приложений, выбирать одно из них и затем запускать его по расписанию. Используя руководства из stackoverflow, мне удалось выяснить, как получить список установленных действий, их имена пакетов и значки (т.е.Вот - несколько способов сделать это). На всякий случай, вот как я начинаю деятельность, она работает без нареканий, здесь нет проблем:

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

Проблема заключается в получении списка установленных приложений. Я нашел два способа получить список установленных приложений:

1) использовать

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

и из каждого элемента изapps Вы можете получить его имя пакета и ярлык пакета (названия приложений).

2) использовать

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    
}

Есть проблема спервый Метод: он возвращает все установленные пакеты, включая системные службы, которые могут не содержать никаких действий и, следовательно, не запускаются. Вот скриншот с примером:

Все элементы выше, которые не имеют значков, не запускаются.

Существует проблема свторой Подход также: несколько пунктов в списке имеют дубликаты:

Когда я устанавливаю точку останова в отладчике, я вижу, что эти элементы «Карты» имеют разные имена действий («com.google.android.maps.MapsActivity», «com.google.android.maps.LatitudeActivity», «com.google»). .android.maps.PlacesActivity "и т. д.).

Я решил использовать второй подход, потому что он дает список, который больше подходит для моих нужд, но я не могу найти способ отфильтровать дубликаты и показать только активность по умолчанию для приложения, как они отображаются в Launcher (вы видите только одну «Карты» в списке приложений вашего телефона, а не четыре). Я пытался отфильтровать системные приложения черезApplicationInfo.FLAG_SYSTEM, но это удаляет многие приложения, которые я хочу иметь, в том числе Карты и другие предустановленные приложения. Я пытался использоватьPackageManager.MATCH_DEFAULT_ONLY флаг при выполнении queryIntentActivities, но это также отфильтровывает многие приложения, оставляя только несколько.

Я немного заблудился здесь, и я не знаю, что делать. Я прочитал все вопросы на stackoverflow о получении списка установленных приложений, но эта проблема никогда не поднималась. Пожалуйста, помогите кому-нибудь? Как мне получить список установленных запускаемых приложений, которые не имеют дубликатов?

Ответы на вопрос(0)

Ваш ответ на вопрос