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 о получении списка установленных приложений, но эта проблема никогда не поднималась. Пожалуйста, помогите кому-нибудь? Как мне получить список установленных запускаемых приложений, которые не имеют дубликатов?