Una manera más rápida o más limpia de averiguar si un paquete está instalado en Android

Sé que puedo capturar el NameNotFoundException de una llamada a PackageManager.getPackageInfo o hacer un bucle a través de la lista PackageInfo devuelta por PackageManager.getInstalledPackages para saber si un paquete en particular está instalado, pero ambos parecen largos o sinuosos. En mi teléfono personal, tengo más de 300 paquetes instalados, así que odiaría tener que hacer esa operación cada vez que necesite comprobar. Y la captura de una excepción como un medio de realizar la lógica de la aplicación sólo me hace sentir mal todo. ¿Estoy perdiendo el método isPackageInstalled en alguna parte, o solo necesito implementarlo usando una de las técnicas mencionadas anteriormente? Y si este último, que sería considerado el más rápido y menos recurso intensivo opción?

Dado que PackageManager.getInstalledPackages() devuelve una List , no es necesario realizar un bucle manualmente. Puede utilizar List.contains() o List.containsAll() para realizar la tarea en una línea de código. Por supuesto, esto no cambia la eficiencia ya que ambos métodos probablemente contienen un bucle ellos mismos.

Si el uso de la API realmente los errores, entonces usted puede mirar en un hack que implica lo siguiente

Bash expresión de shell que obtiene la lista PM Java Runtime expresión Java Pipes y buffers y secuencias Java NIO Java grep

Así que la expresión bash sería:

Pm lista de paquetes -f | Sed 's / ^ package .//' | Awk -F "=" '{print $ 2 "" $ 1}' | ordenar

Y de la lista de referencias para manejar stdout de la 'lista pm' de una manera que podría terminar siendo más rápido …

PipedBuffers

NIO / grep

Tiempo de ejecución / secuencias

Manejar un NameNotFoundExcepetion no debe hacer que te sientas "equivocado en todo" IMHO. De acuerdo con la documentación, esta excepción se lanzará si el paquete no existe desde el nivel de api 1. Usar la sentencia try / catch es muy similar a usar una sentencia if / then para probar un valor nulo.

En este caso, no se debe considerar una solución o un hack como se está utilizando el valor devuelto documentado y esperado de una excepción para determinar si existe un paquete.

Supongo que este método es más rápido que iterar a través de la lista devuelta por getInstalledPackages (). Sin embargo, no sé qué pasos toma androide antes de devolver un NameNotFoundExcepetion. Esto haría una prueba de referencia interesante.

No tengo conocimiento de ningún otro método práctico para probar un paquete instalado.

Escribí algunos puntos de referencia y probé la captura de la excepción vs algunas maneras diferentes de buscar los paquetes instalados y realizar bucle a través de ellos. Aquí está mi resultado

  1. Llamar a PackageManager.getPackageInfo y capturar el NameNotFoundException tomó entre 1 y 4 ms en todos los casos si el paquete solicitado estaba instalado o no, y me aseguré de incluir también los casos en que esta fue la primera llamada a PackageManager para una ejecución particular de la aplicación Y como una llamada posterior sólo en caso de que el marco de cualquier almacenamiento en caché de esta información por lanzamiento de la aplicación.

  2. Llamar a PackageManger.getPackageInfo tomó entre 1 y 1,5 segundos en todos los casos también.

Llamar a getPackageInfo y capturar la excepción para determinar si el paquete no está instalado es, con mucho, la forma más rápida de comprobar.

  • Arreglo de ordenadores de Android
  • Serialización y des-serialización de android.graphics.Bitmap en Java
  • Dentro del proyecto Android de Eclipse se ejecutan clases Java con main (String args) como Java Application hace que "Layout inválido de java.lang.String en value"
  • Simple HTML (o XML) para Android Native Converter
  • ListView onScroll añadir más elementos
  • Error de actualización La cadena de consulta de URL no debe tener el bloque de reemplazo
  • Problemas de conexión HttpsURLConnection
  • Cómo obtener fragmentos para ver correctamente
  • El método managedQuery (Uri, String , String, String , String) del tipo Actividad está obsoleto
  • Android - No se puede obtener la ubicación del GPS en el emulador
  • Android studio auto complete: cómo mostrar constructores con parámetros
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.