En esta página, se explican las prácticas recomendadas para solicitar y administrar permisos de uso de ubicación en segundo plano.
Solicita el permiso de ubicación "Permitir todo el tiempo"
A partir de Android 14, las apps deben tener el permiso ACCESS_BACKGROUND_LOCATION
para acceder a la ubicación del usuario.
El SDK de Navigation incluye este permiso en su archivo de manifiesto, por lo que no es necesario solicitarlo de forma explícita (si no se necesita para otros fines), ya que la combinación de manifiestos de Gradle se asegurará de que se combine con el manifiesto de la app.
Sin embargo, tener el permiso ACCESS_BACKGROUND_LOCATION
no es suficiente para acceder a la ubicación en segundo plano, y te recomendamos que solicites a los usuarios los permisos de ubicación "Permitir todo el tiempo". Esto garantiza que la app se ejecute en segundo plano y muestre notificaciones, lo que maximiza la precisión de la ubicación durante la navegación.
El mensaje debe explicarles a los usuarios cómo otorgar el permiso mejorará la exactitud de la ubicación y su experiencia de navegación cuando la app se ejecute en segundo plano.
Para obtener más información sobre cómo solicitarles a los usuarios acceso a la ubicación, consulta Cómo solicitar permisos de ubicación | Sensores y ubicación | Android Developers en la documentación para desarrolladores de Android.
Cómo garantizar la limpieza adecuada de las notificaciones de navegación
Para asegurarte de que tu app no mantenga activas las notificaciones después de que ya no sean necesarias, asegúrate de realizar los siguientes pasos de limpieza:
- Después de invocar
startGuidance()
, asegúrate de invocarstopGuidance()
oclearDestination()
. - Después de registrar
ArrivalListener
, asegúrate de cancelar el registro. - Después de registrar
RoadSnappedLocationProvider
, asegúrate de cancelar el registro.
Completar estos pasos garantiza que las notificaciones no se mantengan activas cuando ya no sean necesarias, lo que podría provocar agotamiento de la batería y posibles fugas de memoria.
Cuando vuelvas a invocar los métodos NavigationApi#initForegroundServiceManager, primero invoca NavigationApi#clearForegroundServiceManager.
Si tu app usa ForegroundServiceManager
, invoca NavigationApi#clearForegroundServiceManager
antes de invocar NavigationApi#initForegroundServiceManagerProvider
y, si ya inicializaste ForegroundServiceManager
, invoca NavigationApi#initForegroundServiceManagerMessageAndIntent
. Puedes hacerlo para actualizar el ID de notificación o el contenido de la notificación después de inicializar el administrador de servicios en primer plano.
Acerca de las nuevas restricciones que se introdujeron en Android 14
Android 14 (Android U) introdujo nuevas restricciones en las apps que acceden a la ubicación del usuario en segundo plano. Para ayudar a mitigar estos cambios, el SDK de Navigation se actualizó a la versión 5.4.0 para administrar mejor el acceso a la ubicación en segundo plano. También te recomendamos que actualices tu implementación para asegurarte de que tu app siga teniendo acceso a los datos de ubicación más precisos.
Cómo afectan los cambios en Android 14 al SDK de Navigation
Cuando invocas startGuidance()
en tu app, el servicio en primer plano comienza a mostrar notificaciones para el usuario sobre la navegación paso a paso. La navegación paso a paso depende de poder acceder a la ubicación del usuario para actualizar la ruta y mostrar la guía visual y de audio correcta. A partir de Android 14, acceder a la ubicación precisa del usuario en segundo plano requiere su permiso. De forma predeterminada, si una app no tiene el permiso del usuario para acceder a la ubicación en segundo plano y se intenta iniciar un servicio en primer plano para las actualizaciones de ubicación, el sistema arroja una SecurityException
, lo que hace que la app falle.
Cómo mitiga este problema el SDK de Navigation
A partir de la versión 5.4.0, el SDK de Navigation controla este SecurityException
sin afectar a la app, lo que permite que la navegación siga ejecutándose en segundo plano. Además, el SDK de Navigation incluye el permiso ACCESS_BACKGROUND_LOCATION
en su AndroidManifest
. De esta manera, tu app no necesita declarar el permiso, ya que la combinación de Gradle se encargará de ello. Sin embargo, si no se muestra una notificación al usuario antes de que la app se transfiera
a segundo plano, el SDK de Navigation dependerá del sistema para proporcionar
actualizaciones de ubicación. Es posible que estas actualizaciones del sistema no sean frecuentes ni precisas, lo que podría generar una experiencia de navegación subóptima. Por este motivo, te recomendamos que también solicites a los usuarios acceso a la ubicación en segundo plano.
Qué pueden hacer los desarrolladores de apps para mejorar la precisión de la ubicación para la navegación
Puedes mejorar la precisión del indicador de ubicación que usa el SDK de Navigation actualizando tu app para solicitarles a los usuarios acceso a la ubicación en segundo plano. Para obtener más información, consulta Cómo solicitar permisos de ubicación "Permitir todo el tiempo".