Gần đây tôi đã làm việc trên một cái gì đó như thế này. Một điều tôi sẽ nói lên phía trước là để chắc chắn và thực hiện điều này trong một thread riêng biệt - truy vấn thông tin ứng dụng là SLOW. Sau đây sẽ giúp bạn có được danh sách tất cả các ứng dụng đã cài đặt. Điều này sẽ bao gồm rất nhiều ứng dụng hệ thống mà bạn có thể không quan tâm đến.
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(0);
Để hạn chế nó để chỉ người dùng cài đặt hoặc cập nhật hệ thống ứng dụng (ví dụ như Maps, Gmail, vv), tôi đã sử dụng sau logic:
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) != 0) {
installedApps.add(app);
//it's a system app, not interested
} else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
//Discard this one
//in this case, it should be a user-installed app
} else {
installedApps.add(app);
}
}
EDIT: Ngoài ra, để có được tên và biểu tượng cho ứng dụng (mà có lẽ những gì diễn dài nhất - tôi đã không thực hiện bất kỳ kiểm tra sâu thực vào nó - sử dụng này:
String label = (String)pm.getApplicationLabel(app);
Drawable icon = pm.getApplicationIcon(app);
insta lledApps nên có một danh sách đầy đủ các ứng dụng bạn cần, ngay bây giờ. Hy vọng điều này sẽ giúp, nhưng bạn có thể phải sửa đổi logic một chút tùy thuộc vào ứng dụng bạn cần phải trả lại. Một lần nữa, nó là SLOW, nhưng nó chỉ là một cái gì đó bạn phải làm việc xung quanh. Bạn có thể muốn xây dựng một bộ nhớ cache dữ liệu trong cơ sở dữ liệu nếu đó là thứ bạn sẽ truy cập thường xuyên.
Rất nhiều thứ nhưng không có gì không ép buộc hoặc cho tôi lỗi phương pháp có vẻ trả về danh sách mảng nhưng mới làm quen với điều này tôi không biết cách hiển thị trong danh sách trên màn hình như chế độ xem danh sách – user577732