Existen varias formas de solicitar información de la ubicación del usuario en Android, y la mejor ruta varía según el caso de uso. En esta guía, se describen diferentes situaciones de acceso a la ubicación y se explica cómo solicitar permisos de ubicación en cada caso.
Para comenzar, revisa las prácticas recomendadas para todos los permisos de tiempo de ejecución, así como la guía más amplia para minimizar las solicitudes de permisos.
Tipos de acceso a la ubicación
Cada permiso tiene una combinación de las siguientes características:
- Categoría: Ubicación en primer plano o ubicación en segundo plano.
- Precisión: Ubicación precisa o aproximada
Ubicación en primer plano
Si tu app contiene una función que comparte o recibe información de ubicación solo una vez o durante un tiempo definido, esa función requiere acceso a la ubicación en primer plano. Estos son algunos ejemplos:
- Dentro de una app de navegación, una función permite a los usuarios obtener instrucciones paso a paso.
- Dentro de una app de mensajería, una función permite a los usuarios compartir su ubicación actual con otro usuario.
El sistema considera que tu app usa la ubicación en primer plano si una función accede a la ubicación actual del dispositivo en una de las siguientes situaciones:
- Una actividad que pertenece a tu app es visible.
Tu app ejecuta un servicio en primer plano. Cuando se ejecuta un servicio en primer plano, el sistema muestra una notificación persistente para atraer la atención del usuario. Tu app retiene el acceso cuando se coloca en segundo plano, por ejemplo, cuando el usuario presiona el botón Inicio en su dispositivo o apaga la pantalla del dispositivo.
Además, debes declarar un tipo de servicio en primer plano de
location, como se muestra en el siguiente fragmento de código. En Android 10 (nivel de API 29) y versiones posteriores, debes declarar este tipo de servicio en primer plano.<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
Declaras la necesidad de una ubicación en primer plano cuando tu app solicita los permisos
ACCESS_COARSE_LOCATION o los ACCESS_FINE_LOCATION, como se muestra en el siguiente fragmento:
<manifest ... >
<!-- Always include this permission -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Include only if your app benefits from precise location access. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
Acceso único Además de acceder a los datos de ubicación en primer plano, algunos casos de uso tienen la distinción adicional de solo necesitar acceder a la ubicación del usuario en puntos específicos de la experiencia de la app, en lugar de actualizarse de manera constante durante el uso de la app. En estos casos, las apps deben usar el botón de ubicación para solicitar acceso a la ubicación para esa sesión individual de uso de la app. Además, si tu app está orientada a Android 17 (nivel de API 37) o versiones posteriores y solo contiene funciones que requieren acceso a la ubicación basado en la sesión, la política de Google Play requiere que uses el botón de ubicación. Para obtener más detalles, consulta la política del botón de ubicación.
Ubicación en segundo plano
Una app requiere acceso a la ubicación en segundo plano si una función dentro de la app comparte constantemente la ubicación con otros usuarios o usa la API de geovallado. Entre los ejemplos, se incluyen los siguientes:
- Dentro de una app familiar para compartir la ubicación, una función permite que los usuarios compartan la ubicación de forma continua con los miembros de la familia.
- Dentro de una app de IoT, una función permite al usuario configurar sus dispositivos para la casa de modo que se apaguen cuando el usuario salga de su casa y se vuelvan a activar cuando regrese.
El sistema considera que tu app usa la ubicación en segundo plano si accede a la ubicación actual del dispositivo en una situación diferente de la descrita en la sección Ubicación en primer plano. La precisión de la ubicación en segundo plano es la misma que la precisión de la ubicación en primer plano, que depende de los permisos de ubicación que declare tu app.
En Android 10 (nivel de API 29) y versiones posteriores, debes declarar el
ACCESS_BACKGROUND_LOCATION permiso en el manifiesto de tu app para
solicitar acceso a la ubicación en segundo plano durante el tiempo de ejecución. En las versiones anteriores de Android, cuando tu app recibe acceso a la ubicación en primer plano, también recibe automáticamente acceso a la ubicación en segundo plano.
<manifest ... >
<!-- Required only when requesting background location access on
Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
Exactitud
Android admite los siguientes niveles de precisión de la ubicación:
- Aproximada
- Proporciona una estimación de la ubicación del dispositivo. Si esta estimación de la ubicación es
de
LocationManagerServiceoFusedLocationProvider, esta estimación es exacta en un radio de 3 kilómetros cuadrados (aproximadamente, 1.2 millas cuadradas ). Tu app puede recibir ubicaciones con este nivel de precisión cuando declaras el permisoACCESS_COARSE_LOCATION, pero no el permisoACCESS_FINE_LOCATION. - Precisa
- Proporciona una estimación de la ubicación del dispositivo que sea lo más precisa posible.
Si la estimación de la ubicación es de
LocationManagerServiceoFusedLocationProvider, suele ser de 50 metros (160 pies) y, a veces, tan precisa como de unos pocos metros (10 pies) o mejor. Tu app puede recibir ubicaciones con este nivel de precisión cuando declaras el permisoACCESS_FINE_LOCATION.
Si el usuario otorga el permiso de ubicación aproximada, tu app solo tendrá acceso a la ubicación aproximada, independientemente de los permisos de ubicación que tu app declare.
Tu app debería funcionar cuando el usuario solo otorgue acceso a la ubicación aproximada. Si una función de tu app requiere acceso a una ubicación precisa
con el permiso ACCESS_FINE_LOCATION, puedes pedirle al usuario que permita que tu
app acceda a la ubicación precisa.
Recordatorio de acceso a la ubicación en segundo plano
En Android 10 (nivel de API 29) y versiones posteriores, cuando una función de tu app accede a la ubicación del dispositivo en segundo plano por primera vez después de que el usuario otorga acceso a la ubicación en segundo plano, el sistema programa el envío de una notificación al usuario. Esta notificación le recuerda al usuario que permitió que tu app acceda a la ubicación del dispositivo en todo momento. En la figura 8, se muestra una notificación de ejemplo.
Cómo verificar los requisitos de ubicación en las dependencias del SDK de la app
Verifica si tu app usa algún SDK que dependa de los permisos de ubicación, especialmente ACCESS_FINE_LOCATION. Consulta la entrada de blog Getting to know the
behaviors of your SDK dependencies en Medium para obtener
más información.
Recursos adicionales
Para obtener más información sobre los permisos de ubicación en Android, consulta los siguientes materiales:
Codelabs
Videos
Ejemplos
- App de ejemplo para demostrar el uso de permisos de ubicación.