2015-03-09 2 views
0

Я пытаюсь получить все приложения с пользовательского устройства. И есть много примеров, как это сделать. Однако - я хочу показывать только приложения, которые показаны в Launcher и souch. Итак, как установленные приложения, так и системные приложения (например, com.android.calendar). Тем не менее, мне сложно фильтровать такие файлы, как «com.android.certinstaller». Обычно приложения, которые используются ОС, но нет типичных пользователей.Получите пользовательские приложения?

У меня есть две реализации. Один показывает мне только установленные пользователем приложения (так что никаких системных приложений, таких как календарь или дозвона)

PackageManager pm = getActivity().getPackageManager(); 
    List<ApplicationInfo> apps = pm.getInstalledApplications(0); 

    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) == 1) { 
      installedApps.add(app); 
      //it's a system app, not interested 
     } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { 
      //Discard this one 
      //in this case, it should be a user-installed app 
      continue; 
     } else { 
      installedApps.add(app); 
     } 
    } 

и другой, который собирает все приложения:

ArrayList<ApplicationItem> res = new ArrayList<ApplicationItem>(); 
    List<PackageInfo> packs = getActivity().getPackageManager().getInstalledPackages(0); 
    for(int i=0;i<packs.size();i++) { 
     PackageInfo p = packs.get(i); 
     if ((!getSysPackages) && (p.versionName == null)) { 
      continue ; 
     } 
     ApplicationItem newInfo = new ApplicationItem(); 
     newInfo.appname = p.applicationInfo.loadLabel(getActivity().getPackageManager()).toString(); 
     newInfo.pname = p.packageName; 
     newInfo.versionName = p.versionName; 
     newInfo.versionCode = p.versionCode; 
     newInfo.icon = p.applicationInfo.loadIcon(getActivity().getPackageManager()); 
     res.add(newInfo); 
    } 
    return res; 

Зв Есть идеи, как это сделать?

ответ

1

Вы можете получить его с намерением кстати, просто добавьте category_launcher, чтобы определить, что приложение имеет активность будет запущен или не

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

дубликат не будет использовать HashSet

//using hashset so that there will be no duplicate packages, 
    //if no duplicate packages then there will be no duplicate apps 
    HashSet<String> packageNames = new HashSet<String>(0); 
    List<ApplicationInfo> appInfos = new ArrayList<ApplicationInfo>(0); 

    //getting package names and adding them to the hashset 
    for(ResolveInfo resolveInfo : pkgAppsList) { 
     packageNames.add(resolveInfo.activityInfo.packageName); 
    } 

    //now we have unique packages in the hashset, so get their application infos 
    //and add them to the arraylist 
    for(String packageName : packageNames) { 
     try { 
      appInfos.add(packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)); 
     } catch (NameNotFoundException e) { 
      //Do Nothing 
     } 
    } 

    //to sort the list of apps by their names 
    Collections.sort(appInfos, new ApplicationInfo.DisplayNameComparator(packageManager));ApplicationInfo.DisplayNameComparator(packageManager)); 
+0

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

+0

@a_dzik отредактировал мой ответ –

+0

Спасибо! Я думал, что есть более «умный» способ сделать это, но HashSet тоже прекрасен. Еще раз спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^