Как получить список установленных приложений для Android и выбрать один для запуска

Я задал аналогичный вопрос по этому поводу на этой неделе, но я до сих пор не понимаю, как получить список всех установленных приложений, а затем выбрать один для запуска.

Я пробовал:

Intent intent = new Intent(ACTION_MAIN); intent.addCategory(CATEGORY_LAUNCHER); 

и это только показывает приложение, которое предварительно установлено или может запустить тип действия ACTION_MAIN.

Я также знаю, что могу использовать PackageManager для получения всех установленных приложений, но как я могу использовать это для запуска определенного приложения?

17 Solutions collect form web for “Как получить список установленных приложений для Android и выбрать один для запуска”

Ниже приведен код для получения списка действий / приложений, установленных на Android:

 Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); List pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0); 

Вы получите все необходимые данные в ResolveInfo для запуска приложения. Здесь вы можете проверить ResolveInfo javadoc.

Вот более чистый способ использования packageManager

 final PackageManager pm = getPackageManager(); //get a list of installed apps. List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo packageInfo : packages) { Log.d(TAG, "Installed package :" + packageInfo.packageName); Log.d(TAG, "Source dir : " + packageInfo.sourceDir); Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); } // the getLaunchIntentForPackage returns an intent that you can use with startActivity() 

Подробнее здесь http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/

Другой способ фильтрации в системных приложениях (работает с приведенным выше примером):

 /** * Return whether the given PackgeInfo represents a system package or not. * User-installed packages (Market or otherwise) should not be denoted as * system packages. * * @param pkgInfo * @return */ private boolean isSystemPackage(PackageInfo pkgInfo) { return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); } 

Вот хороший пример:

 class PInfo { private String appname = ""; private String pname = ""; private String versionName = ""; private int versionCode = 0; private Drawable icon; private void prettyPrint() { Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode); } } private ArrayList getPackages() { ArrayList apps = getInstalledApps(false); /* false = no system packages */ final int max = apps.size(); for (int i=0; i getInstalledApps(boolean getSysPackages) { ArrayList res = new ArrayList(); List packs = getPackageManager().getInstalledPackages(0); for(int i=0;i 

Получение списка установленных несистемных приложений

 public static void installedApps() { List packList = getPackageManager().getInstalledPackages(0); for (int i=0; i < packList.size(); i++) { PackageInfo packInfo = packList.get(i); if ( (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString(); Log.e("App № " + Integer.toString(i), appName); } } } 

Чтобы фильтровать приложения на основе sytem:

 private boolean isSystemPackage(ResolveInfo ri) { return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; } 

Чтобы получить все установленные приложения, вы можете использовать диспетчер пакетов.

  List apps = getPackageManager().getInstalledPackages(0); 

Для запуска вы можете использовать имя пакета

 Intent launchApp = getPackageManager().getLaunchIntentForPackage(“package name”) startActivity(launchApp); 

Более подробно вы можете прочитать этот блог http://codebucket.co.in/android-get-list-of-all-installed-apps/

Вы можете найти список установленных приложений на Android-устройстве, используя приведенный ниже код, «packageInfo» содержит информацию об установленных приложениях на устройстве. мы можем извлечь Intent для приложения, установленного из объекта packageinfo, и с помощью startactivity (намерение), может запустить приложение. зависит от вас, как вы организовываете пользовательский интерфейс Listview или Gridview. поэтому на событии клика, основанном на позиции, вы можете извлечь объект намерения и начать намерение активности.

 final PackageManager pm = getPackageManager(); List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo packageInfo : packages) { if(pm.getLaunchIntentForPackage(packageInfo.packageName)!= null && !pm.getLaunchIntentForPackage(packageInfo.packageName).equals("")) { System.out.println("Package Name :" + packageInfo.packageName); System.out.println("Launch Intent For Package :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); System.out.println("Application Label :" + pm.getApplicationLabel(packageInfo)); System.out.println("Application Label :" + pm.getApplicationIcon(packageInfo.packageName).toString()); System.out.println("i : "+i); /*if(i==2) { startActivity(pm.getLaunchIntentForPackage(packageInfo.packageName)); break; }*/ i++; } } 

Если есть несколько пусковых установок в одном пакете выше кода, возникает проблема. Например: на LG Optimus Facebook для LG, MySpace для LG, Twitter для LG содержит в одном пакете имя SNS, и если вы используете выше, SNS будет повторяться. После нескольких часов исследований я пришел с кодом ниже. Кажется, хорошо работает.

 private List getInstalledComponentList() throws NameNotFoundException { final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); List ril = getPackageManager().queryIntentActivities(mainIntent, 0); List componentList = new ArrayList(); String name = null; for (ResolveInfo ri : ril) { if (ri.activityInfo != null) { Resources res = getPackageManager().getResourcesForApplication(ri.activityInfo.applicationInfo); if (ri.activityInfo.labelRes != 0) { name = res.getString(ri.activityInfo.labelRes); } else { name = ri.activityInfo.applicationInfo.loadLabel( getPackageManager()).toString(); } componentList.add(name); } } return componentList; } 

@Jas: У меня больше нет этого кода, но я нашел что-то близкое. Я сделал это для поиска «компонентов» моего приложения, это просто действия с определенной категорией.

 private List getInstalledComponentList() { Intent componentSearchIntent = new Intent(); componentSearchIntent.addCategory(Constants.COMPONENTS_INTENT_CATEGORY); componentSearchIntent.setAction(Constants.COMPONENTS_INTENT_ACTION_DEFAULT); List ril = getPackageManager().queryIntentActivities(componentSearchIntent, PackageManager.MATCH_DEFAULT_ONLY); List componentList = new ArrayList(); Log.d(LOG_TAG, "Search for installed components found " + ril.size() + " matches."); for (ResolveInfo ri : ril) { if (ri.activityInfo != null) { componentList.add(ri.activityInfo.packageName);// + ri.activityInfo.name); Log.d(LOG_TAG, "Found installed: " + componentList.get(componentList.size()-1)); } } return componentList; } 

Я прокомментировал часть, в которой он получил название активности, но это довольно просто.

У меня было требование отфильтровать системные приложения, которые пользователь действительно не использует (например, «com.qualcomm.service», «службы обновления» и т. Д.). В конечном итоге я добавил еще одно условие для фильтрации списка приложений. Я только что проверил, имеет ли приложение «план запуска».

Итак, получившийся код выглядит как …

 PackageManager pm = getPackageManager(); List apps = pm.getInstalledApplications(PackageManager.GET_GIDS); for (ApplicationInfo app : apps) { if(pm.getLaunchIntentForPackage(app.packageName) != null) { // apps with launcher intent if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { // updated system apps } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { // system apps } else { // user installed apps } appsList.add(app); } } 

Чистое решение, эффективно удаляющее системные приложения

Идея этого решения заключается в том, что основная активность каждого системного приложения не имеет значка пользовательского действия . Этот метод дает мне отличный результат:

  public static Set getInstalledApps(Context ctx) { final PackageManager packageManager = ctx.getPackageManager(); final List allInstalledPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA); final Set filteredPackages = new HashSet(); Drawable defaultActivityIcon = packageManager.getDefaultActivityIcon(); for(PackageInfo each : allInstalledPackages) { if(ctx.getPackageName().equals(each.packageName)) { continue; // skip own app } try { // add only apps with application icon Intent intentOfStartActivity = packageManager.getLaunchIntentForPackage(each.packageName); if(intentOfStartActivity == null) continue; Drawable applicationIcon = packageManager.getActivityIcon(intentOfStartActivity); if(applicationIcon != null && !defaultActivityIcon.equals(applicationIcon)) { filteredPackages.add(each); } } catch (PackageManager.NameNotFoundException e) { Log.i("MyTag", "Unknown package name " + each.packageName); } } return filteredPackages; } 
 private static boolean isThisASystemPackage(Context context, PackageInfo packageInfo ) { try { PackageInfo sys = context.getPackageManager().getPackageInfo("android", PackageManager.GET_SIGNATURES); return (packageInfo != null && packageInfo.signatures != null && sys.signatures[0].equals(packageInfo.signatures[0])); } catch (NameNotFoundException e) { return false; } } 

Получите все приложения:

  PackageManager pm = getContext().getPackageManager(); List apps = pm.getInstalledApplications(0); 

Проверьте, открыто ли установленное приложение:

 if((app.flags & (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP | ApplicationInfo.FLAG_SYSTEM)) > 0) { String app_package = app.packageName; Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(app_package); context.startActivity(launchIntent); 

У меня есть другое решение:

 ArrayList myAppsToUpdate; // How to get the system and the user apps. public ArrayList getAppsToUpdate() { PackageManager pm = App.getContext().getPackageManager(); List installedApps = pm.getInstalledApplications(0); myAppsToUpdate = new ArrayList(); for (ApplicationInfo aInfo : installedApps) { if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { // System apps } else { // Users apps AppInfo appInfo = new AppInfo(); appInfo.setAppName(aInfo.loadLabel(pm).toString()); appInfo.setPackageName(aInfo.packageName); appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString()); try { PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0); appInfo.setVersionName(info.versionName.toString()); appInfo.setVersionCode("" + info.versionCode); myAppsToUpdate.add(appInfo); } catch (NameNotFoundException e) { Log.e("ERROR", "we could not get the user's apps"); } } } return myAppsToUpdate; } 

вы можете использовать это:

 PackageManager pm = getApplicationContext().getPackageManager(); List activityList = pm.queryIntentActivities(shareIntent, 0); for (final ResolveInfo app : activityList) { if ((app.activityInfo.name).contains("facebook")) { // facebook } if ((app.activityInfo.name).contains("android.gm")) { // gmail } if ((app.activityInfo.name).contains("mms")) { // android messaging app } if ((app.activityInfo.name).contains("com.android.bluetooth")) { // android bluetooth } } 
 public static List getApplications(Context context) { return context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA); } 
Interesting Posts

Windows: «Эта операция была отменена из-за ограничений, действующих на этом компьютере. Пожалуйста, обратитесь к системному администратору."

Синхронизировать изменения системы на двух компьютерах?

Перенаправить все SSH-трафик через сервер «посредника»

Как установить фильтр «Fade» для FFmpeg?

Защита данных на жестком диске: поиск подходящих технологий

Как подключиться к веб-серверу, работающему на виртуальной машине, когда виртуальная машина находится в режиме NAT?

Какой лучший бесплатный способ удаления дубликатов файлов из iTunes?

Как указать уровень сжатия при использовании tar -zcvf?

Остановить Opera из доменов автозаполнения

Файл автозапуска на USB-накопителе в OS X

Как я могу получить ffmpeg для преобразования .mov в .gif?

Конвертировать mp3 из моно в стерео с помощью Lame

Что такое отладчик и как он может помочь мне диагностировать проблемы?

Как печатать на удаленном компьютере с TeamViewer

В powerpoint, как я могу получить значок пули в текстовом поле, чтобы использовать тот же значок, что и в поле «Нажмите здесь»?

Давайте будем гением компьютера.