5

Si llamogetPackageManager() (.getInstalledPackages PackageManager.GET_ACTIVITIES) devuelve un valor nulo

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

puedo obtener una lista de los paquetes instalados, incluyendo cualquier provivders que declaran (es decir, con pis [i] .providers posiblemente siendo no nulo).

Sin embargo, si incluyo PackageManager.GET_ACITIVITIES entre las banderas, como en

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

espero obtener la "misma" lista de paquetes instalados, pero con pis [i] .activities ser no nulo también. Pero no lo hago, obtengo una lista vacía.

¿Hay algo especial acerca de incluir PackageManager.GET_ACTIVITES entre las banderas que no se menciona en el documentation?

Mi trabajo actual es dejar todo PackageManager.GET_ACTIVITIES de las banderas, a continuación, recorrer la lista devuelta de la siguiente manera:

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

Pero eso parece como un kludge real.

La única mención que pude encontrar de getInstalledPackages (PackageManager.GET_ACTIVITIES) que regresan una lista vacía es here, pero el problema en este caso parece haber sido algo acerca de llamar getInstalledPackages() fuera el hilo principal de la aplicación y que no es el situación en mi caso.

p.s. esta es la acumulación 0,602 VZW de pan de jengibre, en caso de que importa

Respuesta

4

me encontré con el mismo problema y descubrí una mejor solució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); 
      } 
     } 
    } 
} 

en cuenta que necesito para consultar PackageManager dos veces. Una vez que use getPackageManager().getInstalledPackages(...) y otra vez usando getPackageManager().getPackageInfo(...)

Espero que ayude.

+1

Gracias PC, realmente me ayudó –

Cuestiones relacionadas