Как определить список приложений Android, которые находятся в панели приложений
Я использую класс Package Manager, чтобы получить список всех установленных приложений. Я попытался использовать следующие флаги, чтобы определить, что было "пользовательским приложением" против "системного приложения":
ApplicationInfo.FLAG_SYSTEM
ApplicationInfo.FLAG_UPDATED_SYSTEM_APP
Это сработало, но не так, как я хотел. Я хочу иметь возможность отфильтровать список всех приложений, чтобы определить: это приложение видно в панели приложений?
Я не хочу взаимодействовать с низкоуровневыми системными приложениями, так как это может вызвать нежелательные побочные эффекты. Но я хочу включить такие вещи, как "com.google.chrome", потому что это приложение в панели приложений, но технически оно установлено как системное приложение.
Я сделал отладку в списке ApplicationInfo, возвращенном из диспетчера пакетов, и обнаружил, что некоторые приложения имеют значение Int Icon 0 или что-то еще (1254865 и т. Д.). Итак, я попробовал:
List<ApplicationInfo> allApps = Utilities.getAllApps(mContext);
List<ApplicationInfo> visibleApps = new ArrayList<>();
for (ApplicationInfo appInfo : allApps) {
if (appInfo.icon != 0) {
visibleApps.add(appInfo);
}
}
Это помогло мне стать ближе, но на моем стоковом эмуляторе есть 100 "allApps", и эта логика помогла мне перейти к 54 приложениям. Но в ящике всего 25 приложений...
1 ответ
Это приложение видно в ящике приложения?
Если под "ящиком приложения" вы имеете в виду средство запуска домашнего экрана, решение о том, что там показывать, остается за разработчиками средства запуска домашнего экрана.
Вы можете узнать, какие действия предлагаются для показа на панели запуска домашнего экрана, с помощью PackageManager
а также queryIntentActivities()
, находясь в поиске ACTION_MAIN
/CATEGORY_LAUNCHER
деятельность. Отсюда вы можете получить список приложений, предлагающих эти действия (имея в виду, что любое приложение может предлагать 0, 1 или несколько таких действий).