Nav SDK - 无头模式

简介

Navigation SDK (Nav SDK) 提供一流的逐向导航功能,可为客户和司机(尤其是新手司机或不熟悉该地区的司机)提供极大的帮助。不过,在某些特定使用情形下,公司不希望通过逐向导航界面分散驾驶员的注意力,但仍希望跟踪车辆位置并监听与驾驶员所行驶路线相关的事件。例如,卡车司机,尤其是运输危险物品的卡车司机。其他使用不同方式(例如短距离步行)进行配送的公司可能也不需要启用逐向导航,这样可以节省设备的电池续航时间。

范围

本文档介绍了公司如何从 Nav SDK 隐藏导航地图(视图),同时仍能受益于 Nav SDK 在位置跟踪、事件订阅和回调方面的所有功能。以无头模式从 Nav SDK 捕获的数据可用于提高车辆跟踪能力,更准确地了解预计到达时间,最终实现透明度和效率。

导航 SDK 是添加到司机应用中的原生 Android / iOS 库。在出行服务方面,它负责:

  • 从运行该应用的设备获取贴合道路的位置信息。道路贴合位置信息比 Android 的 FusedLocationProvider (FLP) 更精确,因为它会使用 Google 的道路网络将位置信息贴合到最近的路段,从而使 FLP 提供的预计到达时间和位置信息等更加准确。
  • 提供精细的路线指引,让驾驶员能够高效地从 A 点到达 B 点,同时考虑到实时路况和其他路线限制。
  • 通过事件监听器和注册的回调,根据路线进度、位置、速度等触发事件。

默认体验

客户在实现 Nav SDK 时,系统会假定他们需要逐向导航功能。因此,Nav SDK 的文档(AndroidiOS)提供了有关如何实现启用逐向导航的 Nav SDK 的说明。

在 Android 上,通过使用 SupportNavigationFragmentNavigationView,可在应用中渲染精细导航地图;而在 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 变量可以关联到界面组件(即切换开关),以便相应地启用或停用无头模式。

alt_text alt_text
在启用有效导航的情况下运行的 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 的效果:

alt_text alt_text
正在运行的导航

iOS 示例应用

无头模式下的同一应用

实现方面的注意事项

由于无头模式只是从屏幕上隐藏导航地图,因此只能节省屏幕时间,从而延长设备的电池续航时间。不过,由于 Navigation SDK 会继续运行,因此位置信息更新和所有事件回调都会正常触发,因此使用此配置不会产生任何副作用。

总结

本文档展示了导航 SDK 的灵活性,以及在不同操作系统中,在受到限制的情况下,我们可以实现哪些功能。此外,客户还可以自定义驾驶体验,以避免分心并提高安全性。

其他资源

如果出于上述原因,必须在导航期间停用通知,也可以实现此目的,请参阅 Nav SDK 中的修改精细导航路线通知