Ответ 1
В последнее время я работал над чем-то подобным. Одна вещь, которую я скажу заранее, должна быть уверена и выполнить это в отдельном потоке - запрос информации о приложении SLOW. Ниже приведен список всех установленных приложений. Это будет включать в себя множество системных приложений, которые вам, вероятно, не интересуют.
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(0);
Чтобы ограничить его только установленными пользователем или обновленными системными приложениями (например, Maps, 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 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);
}
}
EDIT: Кроме того, чтобы получить имя и значок для приложения (что, вероятно, самое длинное - я не проверил его на самом деле):
String label = (String)pm.getApplicationLabel(app);
Drawable icon = pm.getApplicationIcon(app);
installedApps теперь должен иметь полный список приложений, которые вам нужны. Надеюсь, это поможет, но вам, возможно, придется немного изменить логику в зависимости от того, какие приложения вам нужно вернуть. Опять же, это МЕДЛЕННО, но это просто то, что вам нужно для работы. Возможно, вам захочется создать кеш данных в базе данных, если вы часто будете получать доступ к ним.