Prácticas recomendadas para el uso de la ubicación en segundo plano

En esta página, se explican las prácticas recomendadas para solicitar y administrar los permisos de uso de la ubicación en segundo plano.

Solicita permisos de ubicación con la opció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 necesitas solicitarlo explícitamente (si no es necesario para otros fines), ya que la combinación de manifiestos de Gradle garantizará 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, por lo que te recomendamos que solicites a los usuarios los permisos de ubicación "Permitir todo el tiempo". Esto garantiza que la app se pueda ejecutar en segundo plano y mostrar notificaciones, lo que maximiza la precisión de la ubicación durante la navegación.

El mensaje debe explicarles a los usuarios cómo el otorgamiento del permiso mejorará la precisión de la ubicación y su experiencia de navegación cuando la app se ejecute en segundo plano.

diálogo de permiso de muestra

Para obtener más información sobre cómo solicitar acceso a la ubicación a los usuarios, consulta Cómo solicitar permisos de ubicación | Sensores y ubicación | Android Developers en la documentación para desarrolladores de Android.

Asegúrate de que se limpien correctamente 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 invocar stopGuidance() o clearDestination().
  • 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 que se agote la batería y posibles fugas de memoria.

Cuando vuelvas a invocar los métodos NavigationApi#initForegroundServiceManager, invoca primero NavigationApi#clearForegroundServiceManager

Si tu app usa ForegroundServiceManager, invoca NavigationApi#clearForegroundServiceManager antes de invocar NavigationApi#initForegroundServiceManagerProvider. Si ya inicializaste ForegroundServiceManager, invoca NavigationApi#initForegroundServiceManagerMessageAndIntent. Puedes hacerlo para actualizar el ID 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 para las apps que acceden a la ubicación del usuario en segundo plano. Para ayudar a mitigar estos cambios, se actualizó el SDK de Navigation en 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 de Android 14 al SDK de Navigation

Cuando invocas startGuidance() en tu app, el servicio en primer plano comienza a mostrar notificaciones al usuario para 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, para acceder a la ubicación precisa del usuario en segundo plano, se 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, además, intenta iniciar un servicio en primer plano para obtener actualizaciones de ubicación, el sistema arroja una SecurityException, lo que hace que la app falle.

Cómo el SDK de Navigation mitiga este problema

A partir de la versión 5.4.0, el SDK de Navigation controla este SecurityException sin afectar 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 eso. Sin embargo, si no se muestra una notificación al usuario antes de que la app pase a segundo plano, el SDK de Navigation dependerá del sistema para proporcionar ubicaciones actualizadas. Es posible que estas actualizaciones del sistema no sean frecuentes ni precisas, lo que puede 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 de la señal de ubicación que usa el SDK de Navigation actualizando tu app para que solicite 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".