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
类中提供的方法。您可以将它们视为MapView
和MapFragment
类,但支持导航。 - 已移除的功能
- 某些 Google 地图功能被移除了,因为它们在导航环境中没有意义,或者存在技术不兼容问题。
移除的功能包括:
- 街景。
- 精简模式不足以导航。
- 当相机处于跟随模式时,您无法设置
LocationProvider
。这是因为导航依赖于RoadSnappedLocationProvider
,切换到此提供程序可能会导致导航时出现问题。 - 当相机处于跟踪模式时,应用最小/最大缩放和
LatLng
边界不会产生任何影响。 - 如果这些缺失的功能给您带来了困难,请与您的客户代表联系。
迁移步骤
- 从 build(即 Gradle)中移除 Maps SDK for Android 集成。同时拥有两个 SDK 将导致编译错误。
- 将
MapView
的实例替换为NavigationView
的实例。 - 将
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()
已移至NavigationView
和SupportNavigationFragment
。Camera.followMyLocation()
方法已移至GoogleMap
。
- 您可以将对
Camera.setLocation()
的调用替换为GoogleMap.moveCamera()
或GoogleMap.animateCamera()
。 - 向
GoogleMap
添加了setOnFollowMyLocationCallback()
和isCameraFollowingMyLocation()
,以提供有关以下模式的更多信息。
第 3 步:合并活动流
如果您之前使用的是 V1 版 Navigation SDK 并按照上述说明操作,那么您应该将地图用例改为使用 NavigationView
类,并且您已迁移导航用例以使用 GoogleMap
。不过,您将有两个 GoogleMap
实例和两个 NavigationView
实例。这意味着,您仍然会过度使用内存,并且在两个实例之间切换可能会导致可察觉到的暂停,从而保证界面的流畅渲染。如需解决此问题,您应合并 activity/fragment 流,以便它们可以共享单个实例。这可以提供更顺畅的用户体验并简化您的应用。