2013-07-06 6 views
16

Chcę uzyskać wszystkie aplikacje, które pojawiają się na ekranie menu. Ale teraz otrzymuję tylko aplikacje zainstalowane przez użytkownika lub całą aplikację (w tym aplikację systemową).Jak uzyskać zainstalowane aplikacje w systemie Android i bez aplikacji systemowych?

Mój obecny kod jest:

final PackageManager pm = getActivity().getPackageManager(); 
    List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_META_DATA); 

    ArrayList<PackageInfo> aux = new ArrayList<PackageInfo>(); 

    for (int i = 0; i < apps.size(); i++) { 
     if (apps.get(i).versionName != null && ((apps.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 1)) { 
      aux.add(apps.get(i)); 
     } 

Z tego kodu, można uzyskać aplikacje zainstalowane przez użytkownika, a jeśli ja skomentować „if” instrukcji, będę się aplikacje systemowe.

Chcę więc zainstalować zainstalowane aplikacje i aplikacje, takie jak kontakty, galeria itp.

UPDATE:

final PackageManager pm = getActivity().getPackageManager(); 
    Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    List<ResolveInfo> apps = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA); 
+2

ale kontaktów jest aplikacja systemowa aplikacji, takich jak YouTube, Gmail, itp? Proszę wyjaśnić różnicę. Jakiej listy aplikacji chcesz? – Blundell

+0

Chcę uzyskać listę wszystkich aplikacji wyświetlanych na ekranie menu. – beni

+0

, ale kontakty pojawiają się na ekranie menu? tj. aplikacje systemowe. Może pomoże ci kolejne pytanie. Jakie konkretne aplikacje * nie * chcesz? – Blundell

Odpowiedz

7
final PackageManager pm = getActivity().getPackageManager(); 
Intent intent = new Intent(Intent.ACTION_MAIN, null); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 
List<ResolveInfo> apps = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA); 
+1

co robi "GET_META_DATA"? Widzę pole "metadanych" w wypełnianiu obiektów ApplicationInfo, ale jaki jest jego cel i dlaczego powinniśmy je zdobyć? –

+0

Dla urządzeń z wieloma zainstalowanymi aplikacjami ten fragment kodu wyrzuci TransactionTooLargeException, sprawdź tę odpowiedź http: // stackoverflow.com/a/24265790/1245275 – koleanu

+0

@ beni, tutaj jak mogę pominąć aplikacje o zduplikowanej nazwie pakietu? – Manu

35
final PackageManager pm = getPackageManager(); 
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); 

Stosując PackageInfo:

private boolean isSystemPackage(PackageInfo packageInfo) { 
    return ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); 
} 

Stosując ResolveInfo:

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

Stosując ApplicationInfo:

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

Filtruje pakiet systemowy. Zobacz pytanie: this. Napisy: Nelson Ramirez i Kenneth Evans.

+0

świetna odpowiedź! .. – Opiatefuchs

+0

Najlepsza i prawdziwa odpowiedź –

+0

Dziękuję jej wspaniałą –

1

Miałem takie same wymagania. Ostatecznie dodałem kolejny warunek do odfiltrowania listy aplikacji. Właśnie sprawdziłem, czy aplikacja ma "intencję programu uruchamiającego".

Więc, kod wynikowy wygląda ...

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) == 1) { 
        // updated system apps 

       } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { 
        // system apps 

       } else { 
        // user installed apps 

       } 
       appsList.add(app); 
      } 

     } 
-1

Poniżej kod daje wszystkie aplikacje systemowe związane z systemem operacyjnym. To nie będzie zawierała


try { 
    ApplicationInfo ai = getPackageManager().getApplicationInfo(item.packageName, 0); 
    if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 
     if((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) { 
     appItem.setSystemApp(true); 
     Mylog.v("System Apps " + appItem.getAppName()); 
     } 
    } 
    } catch (PackageManager.NameNotFoundException e) { 
    e.printStackTrace(); 
    } 
Powiązane problemy