2012-10-02 27 views
10

Im làm việc trên một ứng dụng mà tôi muốn giới thiệu cho người dùng với tất cả các ứng dụng đã cài đặt và cho phép người đó chọn một ứng dụng. Tôi theo một hướng dẫn (điều này: http://impressive-artworx.de/2011/list-all-installed-apps-in-style/) mặc dù tôi đang gặp một số vấn đề. Sau khi làm theo hướng dẫn, tôi chỉ có các ứng dụng chưa được cài đặt sẵn (như tất cả các ứng dụng nền không thể khởi chạy), điều này thật tuyệt nếu bạn muốn các ứng dụng mà người dùng đã tải xuống từ cửa hàng phát. Vấn đề là trong ứng dụng của tôi, tôi muốn hiển thị các ứng dụng hệ thống có thể khởi chạy như Youtube và Trình duyệt nhưng không hiển thị các ứng dụng không thể khởi chạy như Nhà cung cấp ứng dụng tìm kiếm.Lọc ra các ứng dụng không thể khởi chạy khi nhận tất cả các ứng dụng đã cài đặt

Dưới đây là đoạn code mà tôi đang sử dụng khi để có được những ứng dụng:

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

Bây giờ câu hỏi của tôi là; cách tốt nhất để lọc ra các ứng dụng không khởi chạy là gì?

Mọi trợ giúp đều được đánh giá cao!

Trả lời

25

Cách tốt nhất là:

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

Đây không phải là một ý tưởng tốt, bởi vì một số ứng dụng trả về null cho getLaunchIntentForPackageName. Với giải pháp này, tôi gặp sự cố là ứng dụng "Điện thoại" không nằm trong danh sách ứng dụng. Để có giải pháp tốt hơn, hãy xem tại đây: https://stackoverflow.com/a/30446616/4274651 – Janosch