Я недавно работал над чем-то вроде этого. Прежде всего я хочу сказать одно: убедиться в этом и выполнить это в отдельном потоке - запрос информации о приложении - МЕДЛЕННЫЙ. Далее вы получите список ВСЕХ установленных приложений. Это будет включать множество системных приложений, которые вам, вероятно, не интересны.
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(0);
Чтобы ограничить его только установленными пользователем или обновленными системными приложениями (например, Карты, GMail и т. Д.), Я использовал следующую логику:
List<ApplicationInfo> installedApps = new ArrayList<ApplicationInfo>();
for(ApplicationInfo app : apps) {
//checks for flags; if flagged, check if updated system app
if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
installedApps.add(app);
//it's a system app, not interested
} else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
//Discard this one
//in this case, it should be a user-installed app
} else {
installedApps.add(app);
}
}
РЕДАКТИРОВАТЬ: Кроме того, чтобы получить имя и значок для приложения (что, вероятно, занимает больше всего времени - я не сделал никакого глубокого осмотра на нем - используйте это:
String label = (String)pm.getApplicationLabel(app);
Drawable icon = pm.getApplicationIcon(app);
Установленные приложения должны иметь полный список необходимых вам приложений. Надеюсь, это поможет, но вам, возможно, придется немного изменить логику в зависимости от того, какие приложения вам нужно вернуть. Опять же, это МЕДЛЕННО, но это просто то, что вы должны обойти. Возможно, вы захотите создать кеш данных в базе данных, если вы часто обращаетесь к нему.