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.

  • Cambiar dinámicamente el límite de una referencia de consulta de Firebase en Android
  • Principiante Programador Interesado en Android - ¿Debo comenzar con Java?
  • Uso de la actividad de la cámara en Android
  • No se puede obtener android.support.v7.widget.SearchView para aceptar el texto
  • Establecer fecha mínima para DatePickerDialog obtener IllegalArgumentException Fromdate no precede toDate
  • Android: AndroidHttpClient - ¿cómo establecer el tiempo de espera?
  • Cómo definir negrita en un selector de Android?
  • El contenido no está permitido en prolog
  • Uso de Java gcm-server para enviar mensajes al tema
  • Pasando enActividadResultado en Córdoba
  • GetSearchForm devuelve null cuando se utiliza UserSearch en XMPP con aSmack
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.