Я пишу приложение, которое позволяет пользователю просматривать список установленных приложений, выбирать один из них, а затем запускать его по расписанию. Используя учебники из 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: он возвращает все установленные пакеты, включая системные службы, которые могут не содержать никакой активности и поэтому не могут запускаться. Вот скриншот с примером:
Все элементы, которые не имеют значков, не запускаются.
Существует проблема с подходом второй: несколько элементов в списке имеют дубликаты:
Когда я устанавливаю точку останова в отладчике, я вижу, что эти элементы "Карты" имеют разные имена активности ( "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 о том, как получить список установленных приложений, но этот вопрос так и не был поднят. Пожалуйста, помогите кому-нибудь? Как получить список установленных запущенных приложений, у которых нет дубликатов?