2012-10-02 12 views
10

Sto lavorando su un'app in cui voglio presentare l'utente con tutte le app installate e lasciargli scegliere una e quindi fare qualcosa con esso. Ho seguito un tutorial (questo: http://impressive-artworx.de/2011/list-all-installed-apps-in-style/) anche se sto avendo alcuni problemi. Dopo aver seguito il tutorial ho ricevuto solo app che non erano preinstallate (come tutte le app in background che non sono lavabili), il che è fantastico se vuoi le app che l'utente ha scaricato dal Play Store. Il problema è che nella mia app voglio visualizzare le app di sistema pubblicabili come Youtube e Browser ma non quelle non lavabili come Search Application Provider.Filtra le app non riscritte quando ricevi tutte le app installate

Ecco il codice che sto usando quando per ottenere le applicazioni:

private List<App> loadInstalledApps(boolean includeSysApps) { 
    List<App> apps = new ArrayList<App>(); 

    // the package manager contains the information about all installed apps 
    PackageManager packageManager = getPackageManager(); 

    List<PackageInfo> packs = packageManager.getInstalledPackages(0); //PackageManager.GET_META_DATA 

    for(int i=0; i < packs.size(); i++) { 
    PackageInfo p = packs.get(i); 
    ApplicationInfo a = p.applicationInfo; 

    App app = new App(); 
    app.setTitle(p.applicationInfo.loadLabel(packageManager).toString()); 
    app.setPackageName(p.packageName); 
    app.setVersionName(p.versionName); 
    app.setVersionCode(p.versionCode); 
    CharSequence description = p.applicationInfo.loadDescription(packageManager); 
    app.setDescription(description != null ? description.toString() : ""); 
    apps.add(app); 
    } 
    return apps; 
    } 

Ora la mia domanda è; qual è il modo migliore per filtrare le app non pubblicabili?

Qualsiasi aiuto è apprezzato!

risposta

25

Il modo migliore è:

public static List<ApplicationInfo> getAllInstalledApplications(Context context) { 
    List<ApplicationInfo> installedApps = context.getPackageManager().getInstalledApplications(PackageManager.PERMISSION_GRANTED); 
    List<ApplicationInfo> launchableInstalledApps = new ArrayList<ApplicationInfo>(); 
    for(int i =0; i<installedApps.size(); i++){ 
     if(context.getPackageManager().getLaunchIntentForPackage(installedApps.get(i).packageName) != null){ 
      //If you're here, then this is a launch-able app 
      launchableInstalledApps.add(installedApps.get(i)); 
     } 
    } 
    return launchableInstalledApps; 
} 
+0

Questa non è una buona idea, perché alcune applicazioni ritorno nullo per getLaunchIntentForPackageName. Con questa soluzione ho avuto il problema che l'app "Telefonia" non era nell'elenco delle app. Per una soluzione migliore guarda qui: https://stackoverflow.com/a/30446616/4274651 – Janosch

Problemi correlati