2011-04-01 37 views
9

Làm cách nào để có được danh sách các ứng dụng của bên thứ ba được cài đặt trên điện thoại Android.Ứng dụng đã cài đặt là của bên thứ ba hoặc không phải là

Tôi có thể lấy danh sách ứng dụng có mã bên dưới nhưng tôi chỉ muốn các ứng dụng của bên thứ ba.

PackageManager pm = context.getPackageManager(); 
appInstalModel.setAppName(p.applicationInfo.loadLabel(context.getPackageManager()).toString()); 
appInstalModel.setAppPkg(p.packageName); 
appInstalModel.setAppVersionName(p.versionName); 
+0

Bạn có ý nghĩa gì bởi bên thứ ba? Không phải từ Google? Không phải từ bạn? – RoflcoptrException

+0

@Roflcoptr Được cài đặt trên hệ thống hoặc được cài đặt bởi người dùng. –

Trả lời

7
List<ApplicationInfo> apps = getPackageManager().getInstalledApplications(0); 
    for (int i=0; i < apps.size(); i++) 
    { 
     if ((apps.get(i).flags & ApplicationInfo.FLAG_SYSTEM) == 1) 
     { 
      //System app 
     } 
    } 
+1

Tôi nghĩ rằng nó nên như thế này. if ((apps.get (i) .applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { // Ứng dụng hệ thống } –

2

Đối tượng ApplicationInfo sẽ không đặt cờ FLAG_SYSTEM. Chương trình sdmove có thể có một số mã mẫu.

+0

hoàn hảo. Tôi phải nhìn vào nó. –

+0

Làm thế nào tôi có thể sao chép dự án sdmove? –

2

thay đổi nhỏ trong câu trả lời @Roflcoptr.

List<ApplicationInfo> apps = getPackageManager().getInstalledApplications(0); 
for (int i=0; i < apps.size(); i++) 
{ 
    if ((apps.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) 
    { 
     //System app 
    } 
} 

Cảm ơn @Roflcoptr cho câu trả lời của bạn.

+3

Tôi khuyên bạn nên thay đổi điều này từ '(XXX & ApplicationInfo.FLAG_SYSTEM) == 1) 'to' (XXX & ApplicationInfo.FLAG_SYSTEM)! = 0) 'hoặc' (XXX & ApplicationInfo.FLAG_SYSTEM == ApplicationInfo.FLAG_SYSTEM) '. Các 1 chỉ hoạt động vì FLAG_SYSTEM xảy ra là 1, nhưng đó là một giá trị hardcoded. –

7

Câu trả lời của RoflcoptrException là chính xác. Nhưng trong một số trường hợp, nó sẽ không cung cấp cho bạn tất cả các ứng dụng của bên thứ ba được cài đặt. ApplicationInfo cũng có cờ FLAG_UPDATED_SYSTEM_APP được thiết

Nếu ứng dụng này đã được cài đặt như một cập nhật cho một hệ thống tích hợp ứng dụng

Trên điện thoại thông minh ứng dụng như vậy tôi bao gồm đất bí hiểm Amazone Kindle, Adobe Reader, Slacker Radio và những người khác. Các ứng dụng này không đi kèm với điện thoại và được cài đặt từ Cửa hàng Google Play. Do đó, chúng có thể được coi là ứng dụng của bên thứ ba.

Vì vậy, bạn cũng có thể muốn kiểm tra cờ FLAG_UPDATED_SYSTEM_APP.

final PackageManager packageManager = _context.getPackageManager(); 
List<ApplicationInfo> installedApplications = 
    packageManager.getInstalledApplications(PackageManager.GET_META_DATA); 

for (ApplicationInfo appInfo : installedApplications) 
{ 
    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) 
    { 
     // IS A SYSTEM APP 
    } 

    if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) 
    { 
     // APP WAS INSTALL AS AN UPDATE TO A BUILD-IN SYSTEM APP 
    } 
} 
0
public static List<PackageInfo> getInstalledAppList(Context context) { 
     ArrayList<PackageInfo> packList = (ArrayList<PackageInfo>) context.getPackageManager().getInstalledPackages(0); 
     showLog("/n/n ********************** App List ********************"); 
     for (int i = 0; i < packList.size(); i++) { 

      PackageInfo packInfo = packList.get(i); 
      if ((packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { 
       String appName = packInfo.applicationInfo.loadLabel(context.getPackageManager()).toString(); 
       showLog(appName + "(" + packInfo.packageName + ")"); 
      } else { 
       packList.remove(i); 
       i--; 
      } 
     } 

     showLog("List Size : " + packList.size()); 
     showLog("/n/n ********************** END ********************"); 
     return packList; 
    } 
Các vấn đề liên quan