Guía de migración

El mayor cambio que realizó Google en el SDK de Navigation para la versión 2 es que reemplazamos varias clases del SDK de Navigation por sus contrapartes del SDK de Maps para Android.

A partir de la versión 2.2, el SDK de Navigation es un reemplazo (casi) directo de la API de Maps de los Servicios de Google Play. En lugar de modificar todas las APIs en com.google.android.libraries.maps, se empaquetaron en com.google.android.gms.maps, al igual que los Servicios de Google Play. Esto hace que cambiar entre una versión de los Servicios de Google Play y el SDK de Navigation sea mucho más simple.

Beneficios

  • Mejor uso de la memoria. Ahora utilizas menos memoria y ancho de banda que si usaras el SDK de Navigation y el SDK de Maps para Android.
  • Cambiar del modo de vista de mapa al modo de navegación ahora es más fluido y fácil de usar.
  • Ahora tienes más control sobre la cámara.
  • Ahora puedes dibujar polilíneas y superposiciones, y agregar diseños personalizados al mapa.

Sin embargo, no se admiten funciones como Street View y el modo básico.

Requisitos previos

  • La versión 2 del SDK de Navigation usa Android Jetpack, un conjunto de bibliotecas, herramientas y guías que facilita la escritura de apps de alta calidad. Esto significa que debes migrar tu app para dejar de usar bibliotecas de compatibilidad para usar AndroidX. Para obtener más información, consulta Cómo migrar a AndroidX.

Paso 1: Cómo migrar desde el SDK de Maps para Android

La mayor parte de la funcionalidad del SDK de Maps para Android ahora se incluye en la versión 2 del SDK de Navigation. Se quitaron algunas funciones porque no se necesitaban en un contexto de navegación.

Diferencias importantes

El SDK de Maps para Android estaba disponible en los Servicios de Google Play.
Las funciones del SDK de Maps para Android que se incluyen en la versión 2 del SDK de Navigation se basan en la nueva versión del SDK de Maps para Android y no se incluyen en los Servicios de Google Play. Estas funciones nuevas se ejecutan en un motor más reciente que el de los Servicios de Google Play y tienen varias mejoras. También significa que el mapa se ejecuta en el proceso de tu app y no en el de los Servicios de Google Play.
Se cambió el nombre de algunas clases
En la siguiente tabla, se indican las clases que cambiaron de nombre. Esto se hizo para diferenciarlos de su equivalente del SDK de Maps para Android.
Nombre de clase del SDK de Maps para AndroidNombre de clase del SDK de Navigation
MapView.java NavigationView.java
MapFragment.java SupportNavigationFragment.java
Estas clases contienen una combinación de los métodos disponibles en la clase NavigationView anterior y la clase MapView actual. Son como las clases MapView y MapFragment, pero con compatibilidad de navegación.
Funciones que se quitaron
Se quitaron algunos elementos de Maps porque no tenían sentido en un contexto de navegación o porque existían incompatibilidades técnicas. Entre las funciones que se quitaron, se incluyen las siguientes:
  • Street View.
  • Modo lite, que no es suficiente para la navegación.
  • No puedes establecer un LocationProvider cuando la cámara está en modo Seguir. Esto se debe a que la navegación se basa en el objeto RoadSnappedLocationProvider, y cambiar a este proveedor puede causar problemas durante la navegación.
  • Aplicar los límites de zoom mínimo y máximo y LatLng no tiene ningún efecto cuando la cámara está en modo de seguimiento.
  • Comunícate con tu representante del cliente si estas funciones faltantes te causan problemas.

Pasos de la migración

  1. Quita la integración del SDK de Maps para Android de tu compilación (es decir, Gradle). Tener ambos SDK provocará errores de compilación.
  2. Reemplaza instancias de MapView por instancias de NavigationView.
  3. Reemplaza instancias de MapFragment por instancias de NavigationSupportFragment.

Si tu aplicación no usaba el SDK de Navigation con anterioridad, significa que se completó la migración.

Paso 2. Cómo migrar desde la versión 1.x del SDK de Navigation

Realiza los siguientes pasos para migrar tu integración v1.x del SDK de Navigation a la versión 2.

1. Obtener el mapa con nuevos métodos

La forma de obtener un mapa cambió. Antes de la versión 2, obtenías el mapa mediante una llamada síncrona. Ahora, usarás una llamada asíncrona. En la siguiente tabla, se enumeran los métodos anteriores junto con los nuevos para obtener el mapa.

Método anteriorNuevo método
NavigationView.getMap() NavigationView.getMapAsync()
SupportNavigationFragment.getMap() SupportNavigationFragment.getMapAsync()

2. Cómo migrar bibliotecas

La versión 1.x del SDK de Navigation contenía su propia implementación de varias clases del SDK de Maps para Android. Estas clases pertenecían al paquete com.google.android.libraries.navigation.

En la versión 2, estas clases se reemplazaron por las implementaciones del SDK de Maps para Android, que se encuentran en el paquete com.google.android.gms.maps.model. Puedes migrar tu app para integrar las clases nuevas realizando una búsqueda y un reemplazo.

En la siguiente tabla, se enumeran las clases anteriores junto con las nuevas.

Clase antiguaClase nueva
com.google.android.libraries.navigation.LatLng com.google.android.gms.maps.model.LatLng
com.google.android.libraries.navigation.LatLngBounds com.google.android.gms.maps.model.LatLngBounds
com.google.android.libraries.navigation.Marker com.google.android.gms.maps.model.Marker
com.google.android.libraries.navigation.MarkerOptions com.google.android.gms.maps.model.MarkerOptions
com.google.android.libraries.navigation.VisibleRegion com.google.android.gms.maps.model.VisibleRegion

3. Adapta los cambios a las APIs existentes

En la siguiente tabla, se enumeran los cambios clave que realizó Google en la versión 2 del SDK de Navigation.

MétodoCambiar
NavigationApi.cleanup() Se quitó el elemento. Este método no se usaba para el funcionamiento normal y podía causar un comportamiento impredecible. Debes quitar las llamadas a este método.
RoadSnappedLocationProvider.requestLocationUpdates() Se quitó el elemento. Utiliza addLocationListener() en lugar de esta función.
RoadSnappedLocationProvider.stopRequestingLocationUpdates() Eliminado. Usa removeLocationListener() en su lugar.

4. Cambia a la nueva clase de marcador

La versión 2 del SDK de Navigation ahora usa la misma implementación de la clase Marker que el SDK de Maps para Android. Esto presenta los siguientes cambios.

MétodoCambiar
addMarker(MarkerOptions markerOptions) Ahora usa la clase com.google.android.gms.maps.model.MarkerOptions.
removeMarker(Marker marker) Este método ya no existe. En su lugar, la clase de marcador ahora tiene un método marker.remove().
removeAllMarkers() Este método ya no existe, aunque existe un método clear() que quita todos los marcadores, polilíneas, polígonos y superposiciones del mapa.

Diferencias de MarkerOptions

  • El método describeContents() no existe en la versión 2 del SDK de Navigation. Te permitió guardar los datos de la vista llamando a onSaveInstanceState(). Ahora, deberás realizar el seguimiento de los detalles de la vista para que puedas reconstruirla cuando haya un cambio de configuración.
  • El método navMarker#icon(BitMap) cambió a mapMarker#icon(BitmapDescriptor). Este cambio requiere que migres de usar BitMap a usar BitmapDescriptor.

Métodos de los marcadores

Ahora usarás la clase Marker del paquete com.google.android.gms.maps.model. En la siguiente tabla, se enumeran las diferencias del uso de esta nueva clase Marker.

MétodoCambiar
getAnchorU() Ya no existe.
getAnchorV() Ya no existe.
getIcon() Ya no existe.
Debes mantener una referencia al ícono para usarla después de un cambio de configuración cuando necesites volver a crear el estado del mapa.
getPosition() Todavía existe.
getTitle() Todavía existe.

5. Control de la cámara

Los controles de la cámara proporcionados en la versión 1.x del SDK de Navigation eran relativamente limitados. La versión 2 del SDK de Navigation ahora usa el mismo modelo de cámara que usa el SDK de Maps para Android, excepto que también obtienes un modo de seguimiento similar al de la versión 1.x del SDK de Navigation.

Diferencias clave

  • Se quitó la clase com.google.android.libraries.navigation.Camera en la versión 2.
    • Camera.showRouteOverview() se movió a NavigationView y SupportNavigationFragment.
    • Se movió el método Camera.followMyLocation() a GoogleMap.
  • Puedes reemplazar las llamadas a Camera.setLocation() con GoogleMap.moveCamera() o GoogleMap.animateCamera().
  • Se agregaron setOnFollowMyLocationCallback() y isCameraFollowingMyLocation() a GoogleMap para proporcionar más información sobre el modo de seguimiento.

Paso 3: Cómo combinar flujos de actividad

Si anteriormente usabas la versión 1 del SDK de Navigation y seguiste las instrucciones anteriores, entonces habrás migrado tus casos de uso de mapas para utilizar la clase NavigationView, así como tus casos de uso de navegación para utilizar GoogleMap. Sin embargo, tendrás dos instancias de GoogleMap y dos instancias de NavigationView. Esto significa que seguirás usando más memoria de la necesaria y que alternar entre las dos instancias puede generar pausas perceptibles en la renderización fluida de la interfaz de usuario. Para resolver este problema, debes combinar tus flujos de actividades o fragmentos para que puedan compartir una sola instancia. Esto proporciona una experiencia del usuario más fluida y optimiza tu aplicación.