Intereting Posts
CyanogenMod: Перевести проект Обнаружение конца ScrollView Как изменить ширину дорожки переключателя Android? Предоставить разрешение uri на uri в EXTRA_STREAM с намерением Com.android.dex.DexIndexOverflowException: идентификатор метода не в : 65536 в андроид-студии Android-эмулятор не запускает приложение, запущенное с eclipse Примеры поставщиков контента, не использующих SQLite Разработка приложений Omniauth и Iphone / Android Android EditText с отключением TextInputLayout при достижении предела counterMaxLength после обновления библиотеки поддержки 23.2.0 Как обновить плагин com.android.application? Случайные сбои приложения с фатальным сигналом 7 (SIGBUS), кодом 2 или фатальным сигналом 11 (SIGSEGV), кодом 1 Почему я не могу подписать подпись в Google Maps API Android? Пустое поле электронной почты пользователя Firebase Auth с использованием функции входа в Facebook (Firebase 3.0) Как проверить запуск IntentService Как разрешить двойное нажатие кнопки Button в android?

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

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

Я пробовал:

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

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

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

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

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

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

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

HTH!

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

 final PackageManager pm = getPackageManager(); //get a list of installed apps. List<ApplicationInfo> 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) ? true : false; } 

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

 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<PInfo> getPackages() { ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */ final int max = apps.size(); for (int i=0; i<max; i++) { apps.get(i).prettyPrint(); } return apps; } private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) { ArrayList<PInfo> res = new ArrayList<PInfo>(); List<PackageInfo> packs = getPackageManager().getInstalledPackages(0); for(int i=0;i<packs.size();i++) { PackageInfo p = packs.get(i); if ((!getSysPackages) && (p.versionName == null)) { continue ; } PInfo newInfo = new PInfo(); newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString(); newInfo.pname = p.packageName; newInfo.versionName = p.versionName; newInfo.versionCode = p.versionCode; newInfo.icon = p.applicationInfo.loadIcon(getPackageManager()); res.add(newInfo); } return res; } 

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

 public static void installedApps() { List<PackageInfo> 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<PackageInfo> 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<ApplicationInfo> 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<String> getInstalledComponentList() throws NameNotFoundException { final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> ril = getPackageManager().queryIntentActivities(mainIntent, 0); List<String> componentList = new ArrayList<String>(); 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<String> getInstalledComponentList() { Intent componentSearchIntent = new Intent(); componentSearchIntent.addCategory(Constants.COMPONENTS_INTENT_CATEGORY); componentSearchIntent.setAction(Constants.COMPONENTS_INTENT_ACTION_DEFAULT); List<ResolveInfo> ril = getPackageManager().queryIntentActivities(componentSearchIntent, PackageManager.MATCH_DEFAULT_ONLY); List<String> componentList = new ArrayList<String>(); 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<ApplicationInfo> 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<PackageInfo> getInstalledApps(Context ctx) { final PackageManager packageManager = ctx.getPackageManager(); final List<PackageInfo> allInstalledPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA); final Set<PackageInfo> 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; } } 

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

 ArrayList<AppInfo> myAppsToUpdate; // How to get the system and the user apps. public ArrayList<AppInfo> getAppsToUpdate() { PackageManager pm = App.getContext().getPackageManager(); List<ApplicationInfo> installedApps = pm.getInstalledApplications(0); myAppsToUpdate = new ArrayList<AppInfo>(); 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<ResolveInfo> 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 } }