迁移指南

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

从版本 2.2 开始,Navigation SDK 可(几乎)直接替代 Google Play Services 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 服务中。
Navigation SDK v2 中捆绑的 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 类,但支持导航。
已移除的功能
有些地图功能之所以被移除,是因为这些功能在导航环境中没有意义,或者存在技术不兼容问题。 移除的功能包括:
  • 街景。
  • 精简模式,不适于导航。
  • 当相机处于跟随模式时,您无法设置 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 步:合并 activity 流

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