Я пишу приложение, которое позволяет пользователю просматривать список установленных приложений, выбирать одно из них и затем запускать его по расписанию. Используя руководства из 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
}
Ошибка метода first : он возвращает все установленные пакеты, включая системные службы, которые могут не содержать никаких действий и поэтому не запускаются. Вот скриншот с примером:
![app list with packages](https://i.stack.imgur.com/N1HCo.png)
Все элементы выше без значков не запускаются.
Также существует проблема с вторым подходом: несколько элементов в списке имеют дубликаты:
![app list with duplicates](https://i.stack.imgur.com/I0QrS.png)
Когда я устанавливаю точку останова в отладчике, я вижу, что эти элементы «Карты» имеют разные имена действий («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 о получении списка установленных приложений, но эта проблема никогда не поднималась. Пожалуйста, помогите кому-нибудь? Как получить список установленных запускаемых приложений, в которых нет дубликатов?