5

如果我打电话getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES)返回null

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

我得到的安装包的列表,包括他们宣称任何provivders(即与督察[I] .providers可能是非空)。

但是,如果我有标志中PackageManager.GET_ACITIVITIES,如

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

我希望得到已安装的软件包的“相同”的名单,但与督察[I] .activities为非空以及。但我没有,我得到一个空的名单。

documentation中未提及的标志中包含PackageManager.GET_ACTIVITES有什么特别之处吗?

我目前的解决办法是离开PackageManager.GET_ACTIVITIES出来的标志,然后通过返回的列表循环如下:

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

,但似乎像一个真正的杂牌。

我能找到getInstalledPackages(PackageManager.GET_ACTIVITIES)返回一个空列表的唯一一提的是here,但在这种情况下,这个问题似乎已经被一些关于调用getInstalledPackages()主应用程序线程之外,这是不是在我的情况。

p.s.这是姜饼的0.602 VZW的身材,如果是重要的

回答

4

我遇到了同样的问题,找到了一个更好的解决办法:

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

请注意,我需要查询PackageManager两次。一旦使用getPackageManager().getInstalledPackages(...)并再次使用getPackageManager().getPackageInfo(...)

我希望它有帮助。

+1

感谢电脑,它真的帮助我 –