Руководство по переносу

Самое большое изменение, которое Google внес в Navigation SDK для версии 2, заключается в том, что мы заменили несколько классов Navigation SDK их аналогами из Maps SDK для Android .

Начиная с версии 2.2, Navigation SDK является (почти) полной заменой API карт сервисов Google Play. Вместо переупаковки всех API в com.google.android.libraries.maps они были упакованы в com.google.android.gms.maps, как и сервисы Google Play. Это значительно упрощает переключение между версией Google Play Services и Navigation SDK.

Преимущества

  • Лучшее использование памяти. Теперь вы используете меньше памяти и пропускной способности, чем если бы вы использовали одновременно Navigation SDK и Maps SDK для Android.
  • Переключение из режима просмотра карты в режим навигации теперь стало более плавным и простым в использовании.
  • Теперь у вас есть больший контроль над камерой.
  • Теперь вы можете выполнять такие действия, как рисование полилиний и наложений, а также добавлять на карту собственные стили.

Однако такие функции, как просмотр улиц и упрощенный режим, не поддерживаются.

Предварительные условия

  • Версия 2 Navigation SDK использует Android Jetpack — набор библиотек, инструментов и руководств, упрощающий написание высококачественных приложений. Этот шаг означает, что вы должны перенести свое приложение с использования библиотек поддержки на использование AndroidX . Дополнительную информацию см. в разделе Миграция на AndroidX .

Шаг 1. Миграция с Maps SDK для Android

Большая часть функций Maps SDK для Android теперь включена в версию 2 Navigation SDK. Некоторые функции были удалены, поскольку они не были нужны в контексте навигации.

Важные различия

Maps SDK для Android находился в сервисах Google Play.
Функции Maps SDK для Android, включенные во вторую версию Navigation SDK, основаны на новой версии Maps SDK для Android и отсутствуют в сервисах Google Play. Эти новые функции работают на более новом движке, чем тот, который используется в Сервисах Google Play, и имеют несколько улучшений. Это также означает, что карта запускается в процессе вашего приложения, а не в процессе службы Google Play.
Некоторые классы были переименованы
В следующей таблице перечислены переименованные классы. Это было сделано, чтобы отличить их от аналога Maps SDK для Android.
Maps SDK для Android Название класса Имя класса навигационного SDK
MapView.java NavigationView.java
MapFragment.java SupportNavigationFragment.java
Эти классы содержат сочетание методов, доступных в старом классе NavigationView и текущем классе MapView . Вы можете думать о них как о классах MapView и MapFragment , но с поддержкой навигации.
Удаленные функции
Некоторые функции Карт были удалены, поскольку они не имели смысла в контексте навигации или из-за технической несовместимости. Удаленные функции включают в себя:
  • Просмотр улиц.
  • Облегченный режим, которого недостаточно для навигации.
  • Вы не можете установить LocationProvider , когда камера находится в режиме следования . Это связано с тем, что навигация зависит от RoadSnappedLocationProvider , и переключение на этого поставщика может вызвать проблемы при навигации.
  • Применение минимального/максимального масштабирования и границ LatLng не оказывает никакого эффекта, когда камера находится в режиме слежения.
  • Если эти недостающие функции вызывают у вас затруднения, обратитесь к представителю клиента.

Этапы миграции

  1. Удалите интеграцию Maps SDK для Android из вашей сборки (т. е. Gradle). Наличие обоих SDK приведет к ошибкам компиляции.
  2. Замените экземпляры MapView экземплярами NavigationView .
  3. Замените экземпляры MapFragment экземплярами NavigationSupportFragment .

Если ваше приложение ранее не использовало Navigation SDK, миграция завершена.

Шаг 2. Миграция с версии 1.x навигационного SDK.

Выполните следующие шаги, чтобы перенести интеграцию навигационного SDK версии 1.x в версию 2.

1. Получите карту новыми методами

Способ получения карты изменился. До версии 2 карта получалась с помощью синхронного вызова. Теперь вы будете использовать асинхронный вызов. В следующей таблице перечислены старые и новые методы получения карты.

Старый метод Новый метод
NavigationView.getMap() NavigationView.getMapAsync()
SupportNavigationFragment.getMap() SupportNavigationFragment.getMapAsync()

2. Перенос библиотек

Версия 1.x навигационного SDK содержала собственную реализацию нескольких классов Maps SDK для Android. Эти классы принадлежали пакету com.google.android.libraries.navigation .

В версии 2 эти классы были заменены реализациями Maps SDK для Android, которые находятся в пакете com.google.android.gms.maps.model . Вы можете перенести свое приложение для интеграции новых классов, выполнив поиск и замену.

В следующей таблице перечислены старые классы, а также новые.

Старый класс Новый класс
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. Внесение изменений в существующие API.

В следующей таблице перечислены ключевые изменения, внесенные Google во вторую версию Navigation SDK.

Метод Изменять
NavigationApi.cleanup() Удаленный. Этот метод не использовался для нормальной работы и мог привести к непредсказуемому поведению. Вы должны удалить вызовы этого метода.
RoadSnappedLocationProvider.requestLocationUpdates() Удаленный. Вместо этого используйте addLocationListener() .
RoadSnappedLocationProvider.stopRequestingLocationUpdates() Удаленный. Вместо этого используйте removeLocationListener() .

4. Перейдите на новый класс Marker.

Версия 2 Navigation SDK теперь использует ту же реализацию класса Marker , что и Maps SDK для Android. Это вносит следующие изменения.

Метод Изменять
addMarker(MarkerOptions markerOptions) Теперь использует класс com.google.android.gms.maps.model.MarkerOptions .
removeMarker(Marker marker) Этого метода больше не существует. Вместо этого класс Marker теперь имеет метод marker.remove() .
removeAllMarkers() Этого метода больше не существует, хотя существует методclear clear() , который удаляет с карты все маркеры, полилинии, многоугольники и наложения.

Отличия MarkerOptions

  • Метод describeContents() не существует в версии 2 Navigation SDK. Это позволило вам сохранить данные представления, вызвав onSaveInstanceState() . Теперь вам придется самостоятельно отслеживать детали представления, чтобы иметь возможность восстановить представление при изменении конфигурации.
  • Метод navMarker#icon(BitMap) изменен на mapMarker#icon(BitmapDescriptor) . Это изменение требует перехода от использования BitMap к использованию BitmapDescriptor .

Маркерные методы

Теперь вы будете использовать класс Marker из пакета com.google.android.gms.maps.model . В следующей таблице перечислены различия в использовании этого нового класса Marker .

Метод Изменять
getAnchorU() Более не существует.
getAnchorV() Более не существует.
getIcon() Более не существует.
Вы должны самостоятельно сохранить ссылку на значок для использования после изменения конфигурации, когда вам потребуется воссоздать состояние карты.
getPosition() Все еще существует.
getTitle() Все еще существует.

5. Управление камерой

Элементы управления камерой, предусмотренные в версии 1.x Navigation SDK, были относительно ограничены. Версия 2 Navigation SDK теперь использует ту же модель камеры, что и Maps SDK для Android, за исключением того, что вы также получаете режим следования , аналогичный режиму в версии 1.x Navigation SDK.

Ключевые различия

  • Класс com.google.android.libraries.navigation.Camera был удален в версии 2.
    • Camera.showRouteOverview() был перенесен в NavigationView и SupportNavigationFragment .
    • Метод Camera.followMyLocation() был перенесен в GoogleMap .
  • Вы можете заменить вызовы Camera.setLocation() на GoogleMap.moveCamera() или GoogleMap.animateCamera() .
  • setOnFollowMyLocationCallback() и isCameraFollowingMyLocation() были добавлены в GoogleMap для предоставления дополнительной информации о режиме следования.

Шаг 3. Объединение потоков действий

Если вы ранее использовали версию 1 навигационного SDK и следовали приведенным выше инструкциям, вы перенесете варианты использования карты на использование класса NavigationView , а также перенесете варианты использования навигации на использование GoogleMap . Однако у вас будет два экземпляра GoogleMap и два экземпляра NavigationView . Это означает, что вы по-прежнему будете использовать больше памяти, чем необходимо, и переключение между двумя экземплярами может привести к заметным паузам в плавном рендеринге пользовательского интерфейса. Чтобы решить эту проблему, вам следует объединить потоки активности/фрагментов, чтобы они могли совместно использовать один экземпляр. Это обеспечивает более плавный пользовательский интерфейс и оптимизирует ваше приложение.