5

Nếu tôi gọigetPackageManager() .getInstalledPackages (PackageManager.GET_ACTIVITIES) trả về null

PackageManager pm = getPackageManager() ; 
    List<PackageInfo> pis = pm.getInstalledPackages (PackageManager.GET_PROVIDERS) ; 

tôi nhận được một danh sách các gói cài đặt, bao gồm bất kỳ provivders họ tuyên bố (ví dụ, với pis [i] .providers có thể là không trống).

Tuy nhiên, nếu tôi bao gồm PackageManager.GET_ACITIVITIES một trong những lá cờ, như trong

PackageManager pm = getPackageManager() ; 
    List<PackageInfo> pis = pm.getInstalledPackages (PackageManager.GET_ACTIVITIES | PackageManager.GET_PROVIDERS) ; 

tôi mong đợi để có được "cùng" danh sách các gói cài đặt, nhưng với pis [i] .activities là không null cũng. Nhưng tôi không, tôi nhận được một danh sách trống.

Có điều gì đặc biệt về việc bao gồm PackageManager.GET_ACTIVITES trong số các cờ không đề cập đến trong documentation không?

công việc hiện tại của tôi xung quanh là để lại PackageManager.GET_ACTIVITIES ra khỏi cờ, sau đó lặp qua danh sách trả về như sau:

for (PackageInfo pi : pis) { 
     try { 
      PackageInfo tmp = pm.getPackageInfo (pi.packageName, PackageManager.GET_ACTIVITIES) ; 
      pi.activities = tmp.activities ; 
      } 
     catch (NameNotFoundException e) { 
      Log.e (TAG, e.getMessage()) ; 
      } 

Nhưng điều đó có vẻ như một kludge thực.

Chỉ đề cập đến tôi có thể tìm thấy getInstalledPackages (PackageManager.GET_ACTIVITIES) trả về một danh sách trống là here, nhưng vấn đề trong trường hợp đó dường như là điều gì đó về việc gọi getInstalledPackages() bên ngoài chuỗi ứng dụng chính và đó không phải là tình hình trong trường hợp của tôi.

p.s. đây là 0,602 VZW build của Gingerbread, trong trường hợp có vấn đề

Trả lời

4

tôi đi qua cùng một vấn đề và phát hiện ra một cách giải quyết tốt hơn:

public void listAllActivities() throws NameNotFoundException 
{ 
    List<PackageInfo> packages = getPackageManager().getInstalledPackages(0); 
    for(PackageInfo pack : packages) 
    { 
     ActivityInfo[] activityInfo = getPackageManager().getPackageInfo(pack.packageName, PackageManager.GET_ACTIVITIES).activities; 
     Log.i("Pranay", pack.packageName + " has total " + ((activityInfo==null)?0:activityInfo.length) + " activities"); 
     if(activityInfo!=null) 
     { 
      for(int i=0; i<activityInfo.length; i++) 
      { 
       Log.i("PC", pack.packageName + " ::: " + activityInfo[i].name); 
      } 
     } 
    } 
} 

Chú ý rằng tôi cần phải truy vấn PackageManager hai lần. Khi sử dụng getPackageManager().getInstalledPackages(...) và một lần nữa bằng cách sử dụng getPackageManager().getPackageInfo(...)

Tôi hy vọng điều đó sẽ hữu ích.

+1

Cảm ơn PC, Nó thực sự đã giúp tôi –