2011-01-29 24 views
1

我有以下代碼,它可以很好地獲取android中安裝的所有應用程序的詳細信息,但是當我使用isSystemPackage(ResolveInfo)過濾器時,它會強制關閉。如何從所有安裝的應用程序過濾非系統應用程序

try { 
    lView = (ListView) findViewById(R.id.list1); 

    PackageManager pm = this.getPackageManager(); 

    Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    { 
     List<ResolveInfo> list = pm.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED); 
     for (ResolveInfo rInfo : list) { 
      if (isSystemPackage(rInfo)) { 
       results.add(rInfo.activityInfo.applicationInfo.loadLabel(pm).toString()); 
       Log.w("Installed Applications", rInfo.activityInfo.applicationInfo 
         .loadLabel(pm).toString()); 
      } 

     } 
    } 
} catch(Exception ex) { 
    Toast.makeText(getApplicationContext(), ex.toString(), 4000).show(); 
} 

它產生力關閉

isSystemPackage()的代碼是

private boolean isSystemPackage(ResolveInfo ri){ 
    return ((ri.activityInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)!=0)? 
     true:false; 
} 

我試圖調試它,但不能能夠做到這一點。

回答

8

得到我的答案,這是供他人使用這種代碼。

List<ApplicationInfo> list = getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); 
     for (int n=0;n<list.size();n++) { 
      if((list.get(n).flags & ApplicationInfo.FLAG_SYSTEM)!=1) 
      { 
     results.add(list.get(n).loadLabel(pm).toString()); 
     Log.w("Installed Applications", list.get(n).loadLabel(pm).toString()); 
      } 

     } 

歡呼:)

+0

你是比我快:) :) – Zelimir 2011-01-29 11:42:48

2

請嘗試這種方法。它適用於我:

List<ApplicationInfo> applications = getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); 
for (int n=0; n < applications.size(); n++) 
{ 
    if ((applications.get(n).flags & ApplicationInfo.FLAG_SYSTEM) != 1) 
    { 
     Log.i(tag , "Non-System Aplication name " + applications.get(n).name); 
    } 
} 
相關問題