简介
Navigation SDK (Nav SDK) 提供一流的逐向导航功能,可为客户和司机(尤其是新手司机或不熟悉该地区的司机)提供极大的帮助。不过,在某些特定使用情形下,公司不希望通过逐向导航界面分散驾驶员的注意力,但仍希望跟踪车辆位置并监听与驾驶员所行驶路线相关的事件。例如,卡车司机,尤其是运输危险物品的卡车司机。其他使用不同方式(例如短距离步行)进行配送的公司可能也不需要启用逐向导航,这样可以节省设备的电池续航时间。
范围
本文档介绍了公司如何从 Nav SDK 隐藏导航地图(视图),同时仍能受益于 Nav SDK 在位置跟踪、事件订阅和回调方面的所有功能。以无头模式从 Nav SDK 捕获的数据可用于提高车辆跟踪能力,更准确地了解预计到达时间,最终实现透明度和效率。
Navigation SDK
导航 SDK 是添加到司机应用中的原生 Android / iOS 库。在出行服务方面,它负责:
- 从运行该应用的设备获取贴合道路的位置信息。道路贴合位置信息比 Android 的 FusedLocationProvider (FLP) 更精确,因为它会使用 Google 的道路网络将位置信息贴合到最近的路段,从而使 FLP 提供的预计到达时间和位置信息等更加准确。
- 提供精细的路线指引,让驾驶员能够高效地从 A 点到达 B 点,同时考虑到实时路况和其他路线限制。
- 通过事件监听器和注册的回调,根据路线进度、位置、速度等触发事件。
默认体验
客户在实现 Nav SDK 时,系统会假定他们需要逐向导航功能。因此,Nav SDK 的文档(Android 和 iOS)提供了有关如何实现启用逐向导航的 Nav SDK 的说明。
在 Android 上,通过使用 SupportNavigationFragment 或 NavigationView,可在应用中渲染精细导航地图;而在 iOS 上,则通过使用 GMSMapView 来实现。这些界面元素可将互动式地图和精细导航界面添加到您的应用中。
在下一部分中,我们将比较默认的导航 SDK(已启用逐向导航的代码)与无头导航 SDK 代码(针对 Android 和 iOS),重点介绍所需的更改。
解决方案
Android
在 Android 上,这是作为 Nav SDK 示例应用的一部分提供的 Java 代码。
@Override
@SuppressLint("MissingPermission")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Obtain a reference to the NavigationFragment
setContentView(R.layout.activity_nav_fragment);
mNavFragment = (SupportNavigationFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);
如图所示,视图指向应用于绘制导航体验的布局,在本例中,系统会创建 SupportNavigationFragment,而不是 NavigationView。
如需让 Nav SDK 在无头模式下启动,我们只需移除这两条指令。如果目的是在无头模式和非无头模式(主动导航)之间切换,则可以使用变量来确定是否必须使用无头模式,例如:
Boolean mHeadless = true;
然后,可以像这样在稍后使用它:
@Override
@SuppressLint("MissingPermission")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Obtain a reference to the NavigationFragment
if(!mHeadless) {
setContentView(R.layout.activity_nav_fragment);
mNavFragment =
(SupportNavigationFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);
}
mHeadless
变量可以关联到界面组件(即切换开关),以便相应地启用或停用无头模式。
![]() |
![]() |
在启用有效导航的情况下运行的 Nav SDK(无头模式关闭) | 同一应用,但现在以无头模式运行 Nav SDK |
如上右侧示例所示,Nav SDK 导航在后台运行,但逐向导航体验已停用。
iOS
在 iOS 上,只需在 MapView 初始化期间添加以下设置,即可轻松实现无头模式:\
mapView.isHidden = true
例如:
/// The main map view.
private lazy var mapView: GMSMapView = {
let mapView = GMSMapView(frame: .zero)
mapView.isHidden = true /// Make it headless!
mapView.isNavigationEnabled = true
mapView.settings.compassButton = true
mapView.delegate = self
return mapView
}()
请看下面的效果图 - 屏幕将取决于界面实现方式,此屏幕截图仅用于说明隐藏 mapView 的效果:
![]() |
![]() |
正在运行的导航
iOS 示例应用 |
无头模式下的同一应用 |
实现方面的注意事项
由于无头模式只是从屏幕上隐藏导航地图,因此只能节省屏幕时间,从而延长设备的电池续航时间。不过,由于 Navigation SDK 会继续运行,因此位置信息更新和所有事件回调都会正常触发,因此使用此配置不会产生任何副作用。
总结
本文档展示了导航 SDK 的灵活性,以及在不同操作系统中,在受到限制的情况下,我们可以实现哪些功能。此外,客户还可以自定义驾驶体验,以避免分心并提高安全性。
其他资源
如果出于上述原因,必须在导航期间停用通知,也可以实现此目的,请参阅 Nav SDK 中的修改精细导航路线通知。