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 equivalentes 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 Google Maps de los Servicios de Google Play. En lugar de empaquetar todas las APIs en com.google.android.libraries.maps, estas se empaquetaron en com.google.android.gms.maps al igual que los Servicios de Google Play. Esto simplifica mucho el cambio entre una versión de los Servicios de Google Play y el SDK de Navigation.

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.
  • Ahora, cambiar del modo de vista de mapa al modo de navegación es más fluido y fácil de usar.
  • Ahora tienes más control de la cámara.
  • Ahora, puedes dibujar polilíneas y superposiciones, y agregar diseños personalizados al mapa.

Sin embargo, algunas funciones, como Street View y el modo lite, no son compatibles.

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. Debido a este cambio, debes migrar tu app de las bibliotecas de compatibilidad a 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 las funciones del SDK de Maps para Android ahora se incluye en la versión 2 del SDK de Navigation. Se quitaron algunas funciones porque no eran necesarias en un contexto de navegación.

Diferencias importantes

El SDK de Maps para Android se encontraba 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 encuentran 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 enumeran las clases a las que se les cambió el 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
Esas 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 compatibles con la navegación.
Funciones que se quitaron
Se quitaron algunas funciones de Maps porque no tenían sentido en un contexto de navegación o porque había 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 configurar un objeto LocationProvider cuando la cámara está en el modo de seguimiento. Esto se debe a que la navegación se basa en RoadSnappedLocationProvider, y cambiar a este proveedor puede causar problemas durante la navegación.
  • Aplicar el zoom mínimo y máximo, y los límites de LatLng, no tiene ningún efecto cuando la cámara está en el modo de seguimiento.
  • Habla con tu representante de atención al cliente si estas funciones faltantes te están causando 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 las instancias de MapView por instancias de NavigationView.
  3. Reemplaza las instancias de MapFragment por instancias de NavigationSupportFragment.

Si tu aplicación no usaba el SDK de Navigation, la migración estará completa.

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

Sigue estos pasos para migrar tu integración de la versión 1.x del SDK de Navigation a la versión 2.

1. Obtén el mapa con métodos nuevos

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 indican los métodos antiguos junto con los métodos 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 mediante 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 para la versión 2 del SDK de Navigation.

MétodoCambiar
NavigationApi.cleanup() Se quitó el elemento. Este método no se utilizó para el funcionamiento normal y podrí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. Cómo cambiar a la nueva clase Marker

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 introduce 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 cambio, la clase Marker ahora tiene un método marker.remove().
removeAllMarkers() Este método ya no existe, aunque existe un método clear() que quita del mapa todos los marcadores, las polilíneas, los polígonos y las superposiciones.

Diferencias de MarkerOptions

  • El método describeContents() no existe en la versión 2 del SDK de Navigation. Te permitía guardar los datos de las vistas llamando a onSaveInstanceState(). Ahora, tendrás que realizar un seguimiento de los detalles de la vista por tu cuenta para que puedas reconstruir la vista cuando haya un cambio de configuración.
  • El método navMarker#icon(BitMap) cambió a mapMarker#icon(BitmapDescriptor). Este cambio requiere que migres del uso de BitMap para usar BitmapDescriptor.

Métodos de marcadores

Ahora usarás la clase Marker del paquete com.google.android.gms.maps.model. En la siguiente tabla, se enumeran las diferencias en el 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() Aún existe.
getTitle() Aún existe.

5. Control de la cámara

Los controles de 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

  • En la versión 2, se quitó la clase com.google.android.libraries.navigation.Camera.
    • Se movió Camera.showRouteOverview() a NavigationView y SupportNavigationFragment.
    • Se movió el método Camera.followMyLocation() a GoogleMap.
  • Puedes reemplazar las llamadas a Camera.setLocation() por 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, ya habrás migrado tus casos de uso de mapas para usar la clase NavigationView y, por último, los casos de uso de navegación para usar 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 cambiar entre las dos instancias puede provocar pausas perceptibles en la renderización fluida de la interfaz de usuario. Para resolver este problema, debes combinar tus flujos de actividad y fragmento de modo que puedan compartir una sola instancia. Esto proporciona una experiencia del usuario más fluida y optimiza tu aplicación.