2013-07-06 4 views
16

Ich möchte alle Anwendungen erhalten, die auf dem Menübildschirm angezeigt werden. Aber, jetzt bekomme ich nur den Benutzer installierte Anwendungen oder die gesamte Anwendung (einschließlich der Systemanwendung).Wie installiere ich Anwendungen in Android und keine System-Apps?

Mein aktueller Code ist:

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)); 
     } 

Mit diesem Code kann ich die Benutzer installierten Anwendungen bekommen, und wenn ich die 'if' Anweisung kommentieren, werde ich die System-Apps bekommen.

Also, ich möchte den Benutzer installiert Apps und Anwendungen wie Kontakte, Galerie und so weiter.

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

aber Kontakte ist ein System-App? Bitte erläutern Sie den Unterschied. Welche Liste von Apps möchtest du? – Blundell

+0

Ich möchte eine Liste mit allen Apps erhalten, die auf dem Menübildschirm angezeigt werden. – beni

+0

aber Kontakte erscheinen im Menübildschirm? d.h. System-Apps. Vielleicht hilft eine andere Frage. Welche spezifischen Apps * möchten Sie nicht? – Blundell

Antwort

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

Was macht die "GET_META_DATA"? Ich kann sehen, dass das Feld der "Metadaten" in ApplicationInfo-Objekten gefüllt wird, aber wozu dient es und warum sollten wir es bekommen? –

+0

Für Geräte mit vielen installierten Anwendungen wird dieses Codeteil TransactionTooLargeException auslösen. Bitte überprüfen Sie diese Antwort http: // stackoverflow.com/a/24265790/1245275 – koleanu

+0

@beni, hier, wie kann ich Anwendungen mit doppelten Paketnamen überspringen? – Manu

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

Mit Package:

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

Mit ResolveInfo:

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

Mit Application:

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

Dies filtert das Systempaket. Siehe this Frage. Credits: Nelson Ramirez und Kenneth Evans.

+0

große Antwort! .. – Opiatefuchs

+0

Beste und die echte Antwort –

+0

Vielen Dank seine großartige –

1

Ich hatte die gleiche Anforderung. Letztendlich habe ich eine weitere Bedingung hinzugefügt, um die App-Liste herunterzufiltern. Ich habe gerade überprüft, ob die App 'Launcher Intent' hat.

So sieht der resultierende Code wie ...

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

Im Folgenden Code finden Sie alle System-Apps geben Betriebssystem zusammen. Dies wird nicht enthalten Apps wie YouTube, Google Mail, etc


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(); 
    }