Самое большое изменение, которое 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
не оказывает никакого эффекта, когда камера находится в режиме слежения. - Если эти недостающие функции вызывают у вас затруднения, обратитесь к представителю клиента.
Этапы миграции
- Удалите интеграцию Maps SDK для Android из вашей сборки (т. е. Gradle). Наличие обоих SDK приведет к ошибкам компиляции.
- Замените экземпляры
MapView
экземплярамиNavigationView
. - Замените экземпляры
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
. Это означает, что вы по-прежнему будете использовать больше памяти, чем необходимо, и переключение между двумя экземплярами может привести к заметным паузам в плавном рендеринге пользовательского интерфейса. Чтобы решить эту проблему, вам следует объединить потоки активности/фрагментов, чтобы они могли совместно использовать один экземпляр. Это обеспечивает более плавный пользовательский интерфейс и оптимизирует ваше приложение.