迁移指南

Google 对 Navigation SDK for v2 进行的最大更改是,我们将多个 Navigation SDK 类替换为 Maps SDK for Android 中的对应类。

从 2.2 版开始,Navigation SDK 可以(几乎)来替代 Google Play 服务 Maps API。系统没有将所有 API 重新打包到 com.google.android.library.maps 中,而是像 Google Play 服务一样将其打包到 com.google.android.gms.maps 中。这样可以大大简化 Google Play 服务版本和 Navigation SDK 之间的切换。

优势

  • 内存利用率更高。与同时使用 Navigation SDK 和 Maps SDK for Android 相比,您现在使用的内存和带宽更少。
  • 从地图视图模式切换到导航模式现在更顺畅、更易于使用。
  • 您现在可以更好地控制摄像头了。
  • 您现在可以执行绘制多段线和叠加层等操作,以及向地图添加自定义样式。

但不支持街景和精简模式等功能。

前提条件

  • Navigation SDK 版本 2 使用 Android Jetpack,这是一套库、工具和指南,可帮助您更轻松地编写优质应用。此举意味着,您必须将应用从使用支持库迁移到 AndroidX。如需了解详情,请参阅迁移到 AndroidX

第 1 步:从 Maps SDK for Android 迁移

Maps SDK for Android 中的大部分功能现在都包含在 Navigation SDK 版本 2 中。一些功能已被移除,因为在导航环境中不需要这些功能。

重要差异

Maps SDK for Android 包含在 Google Play 服务中。
v2 版 Navigation SDK 中捆绑的 Maps SDK for Android 功能基于新版 Maps SDK for Android,不在 Google Play 服务中。这些新功能在比 Google Play 服务引擎更新的引擎上运行,并且进行了多项改进。这也意味着,地图会在应用的进程(而不是 Google Play 服务进程)中运行。
某些类已重命名
下表列出了已重命名的类。这样做是为了让它们与 Maps SDK for Android 对应项区分开来。
Maps SDK for Android 类名称Navigation SDK 类名称
MapView.java NavigationView.java
MapFragment.java SupportNavigationFragment.java
这些类混合了旧的 NavigationView 类和当前的 MapView 类中提供的方法。您可以将它们视为 MapViewMapFragment 类,但支持导航。
已移除的功能
某些 Google 地图功能被移除了,因为它们在导航环境中没有意义,或者存在技术不兼容问题。 移除的功能包括:
  • 街景。
  • 精简模式不足以导航。
  • 当相机处于跟随模式时,您无法设置 LocationProvider。这是因为导航依赖于 RoadSnappedLocationProvider,切换到此提供程序可能会导致导航时出现问题。
  • 当相机处于跟踪模式时,应用最小/最大缩放和 LatLng 边界不会产生任何影响。
  • 如果这些缺失的功能给您带来了困难,请与您的客户代表联系。

迁移步骤

  1. 从 build(即 Gradle)中移除 Maps SDK for Android 集成。同时拥有两个 SDK 将导致编译错误。
  2. MapView 的实例替换为 NavigationView 的实例。
  3. MapFragment 的实例替换为 NavigationSupportFragment 的实例。

如果您的应用之前未使用 Navigation SDK,则表示迁移已完成。

第 2 步:从 Navigation SDK v1.x 迁移

请按照以下步骤将 Navigation SDK 的 v1.x 集成迁移到 v2。

1. 使用新方法获取地图

获取地图的方式已发生变化。在 v2 之前,您要使用同步调用来获取地图。现在,您将使用异步调用。下表列出了旧方法以及获取地图的新方法。

原方法新方法
NavigationView.getMap() NavigationView.getMapAsync()
SupportNavigationFragment.getMap() SupportNavigationFragment.getMapAsync()

2. 迁移库

Navigation SDK v1.x 包含自己的多个 Maps SDK for Android 类实现。这些类属于 com.google.android.libraries.navigation 软件包。

在 v2 中,这些类已被 Maps SDK for 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 v2 进行的主要更改。

方法换乘
NavigationApi.cleanup() 已移除。此方法未用于正常操作,可能会导致不可预测的行为。您必须移除对此方法的调用。
RoadSnappedLocationProvider.requestLocationUpdates() 已移除。请改用 addLocationListener()
RoadSnappedLocationProvider.stopRequestingLocationUpdates() 已移除。请改用 removeLocationListener()

4. 更改为新的 Marker 类

Navigation SDK v2 现在使用与 Maps SDK for Android 相同的 Marker 类实现。这会引入以下更改。

方法换乘
addMarker(MarkerOptions markerOptions) 现在使用 com.google.android.gms.maps.model.MarkerOptions 类。
removeMarker(Marker marker) 此方法已不存在。Marker 类现在使用的是 marker.remove() 方法。
removeAllMarkers() 此方法已不存在,但有一种 clear() 方法,可用于从地图中移除所有标记、多段线、多边形和叠加层。

MarkerOptions 的差异

  • Navigation SDK v2 中不存在 describeContents() 方法。它允许您通过调用 onSaveInstanceState() 来保存视图数据。现在,您必须自行跟踪视图详细信息,以便在配置发生更改时能够重建视图。
  • navMarker#icon(BitMap) 方法已更改为 mapMarker#icon(BitmapDescriptor)。此更改要求您从使用 BitMap 改为使用 BitmapDescriptor

标记方法

您现在可以使用 com.google.android.gms.maps.model 软件包中的 Marker 类。下表列出了使用以下新 Marker 类时的差异。

方法换乘
getAnchorU() 已不存在。
getAnchorV() 已不存在。
getIcon() 已不存在。
如需重新创建地图状态,您必须自行保留对图标的引用,以便在配置更改后使用。
getPosition() 仍然存在。
getTitle() 仍然存在。

5. 摄像头控件

Navigation SDK v1.x 中提供的相机控件相对有限。Navigation SDK 版本 2 现在使用的相机型号与 Maps SDK for Android 所用的相同,只是您还会获得一个与 Navigation SDK v1.x 中类似的跟踪模式

主要区别

  • v2 中移除了 com.google.android.libraries.navigation.Camera 类。
    • Camera.showRouteOverview() 已移至 NavigationViewSupportNavigationFragment
    • Camera.followMyLocation() 方法已移至 GoogleMap
  • 您可以将对 Camera.setLocation() 的调用替换为 GoogleMap.moveCamera()GoogleMap.animateCamera()
  • GoogleMap 添加了 setOnFollowMyLocationCallback()isCameraFollowingMyLocation(),以提供有关以下模式的更多信息。

第 3 步:合并活动流

如果您之前使用的是 V1 版 Navigation SDK 并按照上述说明操作,那么您应该将地图用例改为使用 NavigationView 类,并且您已迁移导航用例以使用 GoogleMap。不过,您将有两个 GoogleMap 实例和两个 NavigationView 实例。这意味着,您仍然会过度使用内存,并且在两个实例之间切换可能会导致可察觉到的暂停,从而保证界面的流畅渲染。如需解决此问题,您应合并 activity/fragment 流,以便它们可以共享单个实例。这可以提供更顺畅的用户体验并简化您的应用。