studio permission permisos manager example current android gps geolocation android-permissions android-gps

permission - permisos gps android studio



¿Cuándo necesito android.hardware.location.gps y android.hardware.location.network? (6)

Google informa por correo electrónico de los cambios en los permisos de ubicación de Android:

Estamos realizando un cambio el 15 de octubre de 2016 que afectará a las aplicaciones dirigidas a la API versión 21 (Android 5.0, Lollipop) o superior que usa ACCESS_FINE_LOCATION pero no tiene explícitamente la función de usos "android.hardware.location.gps". En el futuro, estas aplicaciones estarán disponibles para instalarse en dispositivos que no tengan hardware GPS. En la mayoría de los casos, esto no será un problema ya que la ubicación basada en Wi-Fi y Cell-ID proporciona una fidelidad lo suficientemente alta para el funcionamiento típico de estas aplicaciones. Sin embargo, cualquier aplicación que requiera hardware de GPS, como los navegadores GPS, debe agregar explícitamente la característica "android.hardware.location.gps" a su manifiesto.

Si su aplicación requiere que el GPS funcione correctamente y no se incluye en su declaración de manifiesto, sus usuarios pueden tener una experiencia de aplicación pobre.

Además, si está utilizando el proveedor de ubicación fusionado y desea recibir las muestras de ubicación más precisas de GPS (es decir, con PRIORITY_HIGH_ACCURACY), debe incluir la función "android.hardware.location.gps" en el manifiesto de su aplicación para asegurarse de que Google Play solo distribuye su aplicación a dispositivos con sensores GPS.

Puede leer más sobre este cambio en el Centro de ayuda para desarrolladores de Android .

Desde el Centro de ayuda para desarrolladores de Android

Para recibir actualizaciones de ubicación de NETWORK_PROVIDER o GPS_PROVIDER, debe solicitar el permiso del usuario declarando el permiso ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION, respectivamente, en su archivo de manifiesto de Android. Sin estos permisos, su aplicación fallará en tiempo de ejecución al solicitar actualizaciones de ubicación.

Si está utilizando NETWORK_PROVIDER y GPS_PROVIDER, debe solicitar solo el permiso ACCESS_FINE_LOCATION, ya que incluye permiso para ambos proveedores. El permiso para ACCESS_COARSE_LOCATION permite el acceso solo a NETWORK_PROVIDER.

Precaución: si su aplicación apunta a Android 5.0 (nivel API 21) o superior, debe declarar que su aplicación usa la función de hardware android.hardware.location.network o android.hardware.location.gps en el archivo de manifiesto, dependiendo de si su la aplicación recibe actualizaciones de ubicación de NETWORK_PROVIDER o de GPS_PROVIDER. Si su aplicación recibe información de ubicación de cualquiera de estos orígenes de proveedores de ubicación, debe declarar que la aplicación utiliza estas características de hardware en su manifiesto de aplicación. En los dispositivos que ejecutan versiones anteriores a Android 5.0 (API 21), la solicitud del permiso ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION incluye una solicitud implícita de características de hardware de ubicación. Sin embargo, la solicitud de esos permisos no solicita automáticamente las características de hardware de ubicación en Android 5.0 (nivel de API 21) y superior.

Estoy usando el proveedor de ubicación fusionada, apuntando a API 21 y usando ACCESS_FINE_LOCATION . No me importa específicamente si el GPS está disponible, solo que se informe la ubicación más precisa.

  • Sobre la base de la primera cita, creo que no tengo que hacer ningún cambio.
  • Según la segunda cita, creo que necesito tanto android.hardware.location.gps como android.hardware.location.network . ¿O es solo para LocationManager y no para la LocationManager fusionada?

¿Necesito android.hardware.location.gps y android.hardware.location.network o no?


A mi entender, es suficiente leer la documentación del elemento de característica de usos para comprender cómo se filtran las aplicaciones en Google Play en función de las entradas de características de usos implícitos y explícitos:

Google Play filtra las aplicaciones que son visibles para los usuarios, de modo que los usuarios pueden ver y descargar solo las aplicaciones que son compatibles con sus dispositivos. Una de las formas en que filtra las aplicaciones es por compatibilidad de características.

Para determinar la compatibilidad de las características de una aplicación con el dispositivo de un usuario determinado, Google Play compara:

Funciones requeridas por la aplicación: una aplicación declara características en elementos en su manifiesto con ... Características disponibles en el dispositivo, en hardware o software: un dispositivo informa sobre las características que admite como propiedades de sistema de solo lectura.

...

Si una característica se declara explícitamente como requerida, Google Play agrega la característica a la lista de características requeridas para la aplicación. Luego filtra la aplicación de los usuarios en dispositivos que no proporcionan esa función.

Si una función se declara explícitamente como no requerida, Google Play no agrega la función a la lista de funciones requeridas. Por ese motivo, una característica no obligatoria declarada explícitamente nunca se considera al filtrar la aplicación. Incluso si el dispositivo no proporciona la función declarada, Google Play considerará la aplicación compatible con el dispositivo y la mostrará al usuario, a menos que se apliquen otras reglas de filtrado.

Los elementos implícitos uses-feature para los permisos de ubicación son:

ACCESS_COARSE_LOCATION

  • android.hardware.location
  • android.hardware.location.network (solo cuando el nivel de API objetivo es 20 o inferior)

ACCESS_FINE_LOCATION

  • android.hardware.location
  • android.hardware.location.gps (solo cuando el nivel de API objetivo es 20 o inferior)

El cambio descrito en el mensaje de correo electrónico de Google es que los elementos implícitos uses-feature uso para android.hardware.location.gps no estarán presentes en API 21+ con ACCESS_FINE_LOCATION . La situación análoga parece ser cierta para ACCESS_COARSE_LOCATION y android.hardware.location.network .

Google recomienda la enumeración explícita de todas uses-feature entradas de uses-feature , pero aún así proporciona entradas implícitas basadas en permisos. Del siguiente extracto de la documentación, creo que no hay diferencia entre omitir una función de uses-feature y declararla como no obligatoria, a menos que haya una entrada implícita uses-feature .

Si una función se declara explícitamente como no requerida, Google Play no agrega la función a la lista de funciones requeridas.

El caso de uso de su aplicación determina qué uses-feature entradas de uses-feature deben estar presentes. Aquí hay algunos ejemplos de casos de uso, con todas uses-feature entradas de uses-feature que se requieren a menos que se indique lo contrario:

  1. La aplicación utiliza el GPS explícitamente desde LocationManager o la aplicación necesita la alta precisión del GPS. Este es el ejemplo dado en el correo electrónico de Google.

    • ACCESS_FINE_LOCATION
    • android.hardware.location (implícito)
    • android.hardware.location.gps (implícito hasta API 20)
  2. Utiliza la ubicación de la red explícitamente

    • ACCESS_COARSE_LOCATION
    • android.hardware.location (implícito)
    • android.hardware.location.network (implícito hasta API 20)
  3. Utiliza tanto el GPS como la red

    • ACCESS_FINE_LOCATION
    • android.hardware.location (implícito)
    • android.hardware.location.gps (implícito hasta API 20)
    • android.hardware.location.network
  4. Utiliza al menos uno de GPS y Red. Este es mi caso FusedLocationProviderApi en la pregunta original.

    • ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION
    • android.hardware.location (implícito)
  5. Utiliza la ubicación si está disponible, aún permite la instalación de la aplicación si no está disponible

    • ACCESS_FINE_LOCATION
    • android.hardware.location required = false (reemplazo implícito)
    • android.hardware.location.gps required = false (reemplazo implícito hasta API 20)

La segunda cita le indica que necesita android.hardware.location.network o android.hardware.location.gps , si necesita específicamente uno u otro proveedor de ubicación.

Si desea actualizaciones a través de GPS, necesita android.hardware.location.gps . Si desea actualizaciones a través de WiFi y redes celulares, necesita android.hardware.location.network .

Si desea actualizaciones tanto de la red como del GPS, debe incluir ambos elementos <uses-feature> .

Si no especifica ninguno de los dos, su dispositivo puede instalarse en dispositivos sin ese proveedor. Por ejemplo, puede instalarse en un dispositivo sin GPS, red celular o chip Wi-Fi.

En otras palabras, obtener ubicación requiere la función de ubicación de red o la función de GPS. Si no declara que su aplicación necesita una u otra, es posible que no obtenga actualizaciones de ubicación.

API 21 vs 20 e inferior

Tenga en cuenta que lo anterior solo es cierto para API 21 y superior. Antes de API 21, la solicitud del permiso ACCESS_COARSE_LOCATION implicaba la función location.network , mientras que la solicitud ACCESS_FINE_LOCATION implicaba la función location.gps (consulte <uses-feature> ).

El único cambio en este momento es que, para API 21+, cualquier aplicación que solicite ACCESS_FINE_LOCATION pronto estará disponible para instalarse en dispositivos sin GPS. Si su aplicación supuso que el GPS estaba disponible (y necesita GPS), debe asegurarse de tener la solicitud explícita para android.hardware.location.gps .

Google dice que los proveedores de ubicación de red ahora son lo suficientemente buenos para una buena ubicación, por lo tanto, el cambio.


Sí, necesita ambos permisos si está utilizando un proveedor fusionado.

ACCESS_COARSE_LOCATION : para recibir actualizaciones de ubicación de NETWORK_PROVIDER . Agregar el permiso de la característica android.hardware.location.network es suficiente.

ACCESS_FINE_LOCATION : para recibir actualizaciones de ubicación desde NETWORK_PROVIDER y GPS_PROVIDER . Debe agregar los permisos de las funciones android.hardware.location.gps y android.hardware.location.network . Aplicable también para ubicación fusionada.


Según usted preguntas

Sobre la base de la primera cita, creo que no tengo que hacer ningún cambio.

No necesita realizar ningún cambio porque está usando FusedLocation que detecta automáticamente el GPS y el FusedLocation según la disponibilidad y le brinda la mejor ubicación estimada ( necesita agregar el permiso ACCESS_FINE_LOCATION para obtener alta precisión ). Incluso si está apuntando por encima de la versión de API 21 no necesita cambiar nada en su aplicación FusedLocation como antes.

Y según segunda cita

Solo debe ignorarlo porque utiliza la API de FusedLocation y no está utilizando la API de LocationManager que reemplazó por FusedLocation . Por lo tanto, la segunda cotización es solo para aplicaciones que utilizan LocationManagar .

NETWORK_PROVIDER y GPS_PROVIDER son parte de la API de LocationManager Not FusedLocation


Solución rápida y sencilla:

La aplicación necesita actualizaciones a través del uso de GPS android.hardware.location.gps. Si desea actualizaciones a través de WiFi y redes celulares, necesita android.hardware.location.network.

Agregue las siguientes líneas a su archivo de manifiestos según los requisitos de datos de su ubicación:

<uses-feature android:name="android.hardware.location" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" />

Espero que esto ayude..


TL; DR : No, no tiene que agregar uses-feature a su manifiesto, pero dependiendo de eso, puede.

respuesta completa :

uses-feature de uses-feature del manifiesto es solo para que Google Play pueda filtrar los dispositivos que no contienen una característica que es necesaria para que la aplicación se ejecute correctamente. (Los ejemplos son GPS para una aplicación de navegación paso a paso o Cámara para una aplicación de cámara).

Lea cuidadosamente esta cita:

cualquier aplicación que requiera hardware GPS, como los navegadores GPS, debe agregar explícitamente la característica de usos "android.hardware.location.gps" a su manifiesto

(...)

y desea recibir las muestras de localización más precisas de GPS

Como mencionó, solo le importa que FusedLocationProvider le brinde la mejor ubicación disponible para que el dispositivo esté instalado. Eso significa que, aunque solicites PRIORITY_HIGH_ACCURACY , es posible que tu aplicación se instale en dispositivos que no contienen GPS y nunca obtendrás una ubicación tan precisa como un GPS, o tal vez (en algunos casos extraños) se instale en Dispositivo que no contiene ningún proveedor de localización.

editar:

Según la segunda cita, creo que necesito tanto android.hardware.location.gps como android.hardware.location.network. ¿O es solo para LocationManager y no para la ubicación fusionada?

Acabo de investigar en los documentos https://developer.android.com/guide/topics/manifest/uses-feature-element.html#hw-features y me pareció muy interesante, hay 3 posibilidades:

  • android.hardware.location
  • android.hardware.location.gps
  • android.hardware.location.network

por lo tanto, en función de eso, si su aplicación no puede funcionar sin ningún tipo de ubicación, debe usar la primera ubicación de android.hardware.location . De lo contrario, si la aplicación utiliza la ubicación pero no es esencial para su funcionalidad, puede ser libre de no incluir nada.