Nav SDK - 無頭模式

簡介

Navigation SDK (Nav SDK) 提供一流的導航功能,可為顧客和駕駛人提供很大的幫助,尤其是新駕駛人或不熟悉該區域的駕駛人。不過,在特定用途中,公司不希望逐向導航 UI 分散駕駛人的注意力,但仍想追蹤車輛位置,並監聽與行駛路線相關的事件。例如卡車司機 (尤其是運輸危險物質者),如果其他公司使用不同模式 (例如步行短距離) 進行外送,可能也不需要啟用逐向導航,這樣就能延長裝置的電池續航力。

範圍

本文說明公司如何從 Nav SDK 隱藏導航地圖 (檢視畫面),同時仍可享有 Nav SDK 的所有功能,包括位置追蹤、事件訂閱和回呼。從無頭模式的 Navigation SDK 擷取的資料,可用於提升車輛追蹤能力,並更準確地瞭解預計抵達時間,最終達到透明化和效率。

Navigation SDK 是原生 Android / iOS 程式庫,會新增至駕駛人應用程式。在行動裝置的環境中,這項 SDK 負責:

  • 從執行該應用程式取得道路對應位置。與 Android 的 FusedLocationProvider (FLP) 相比,路徑對應位置資訊更精確,因為這項功能會使用 Google 的道路網路,將位置資訊對應至最近的路段,因此 FLP 的預計抵達時間和其他資訊會更加準確。
  • 提供詳細的導航資訊,讓駕駛人能考量即時交通狀況和其他路線限制,有效率地從 A 點抵達 B 點。
  • 透過事件監聽器和已註冊的回呼,根據路線進度、位置、速度等觸發事件。

預設版本

客戶導入 Navigation SDK 時,系統會假設他們需要逐步導航功能。因此,Navigation SDK 的說明文件 (AndroidiOS) 提供相關操作說明,協助您實作 Navigation SDK 並啟用逐步導航功能。

在 Android 上,應用程式會使用 SupportNavigationFragmentNavigationView 算繪行車路線地圖,而 iOS 則使用 GMSMapView。這些 UI 元素會在應用程式中加入互動式地圖和即時路線指示 UI。

在下一節中,我們會比較 Android 和 iOS 的預設 Nav SDK (已啟用逐步導航程式碼) 與無頭 Nav SDK 程式碼,並醒目顯示必要變更。

解決方案

Android

在 Android 上,這是 Java 程式碼,屬於 Nav SDK 範例應用程式的一部分。

@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 變數可以連結至 UI 元件 (即切換鈕),以便啟用或停用無標題模式。

alt_text alt_text
Nav SDK 正在執行,且導航功能處於啟用狀態 (無標頭關閉) 相同應用程式,但現在 Nav SDK 以無頭模式執行

如上圖右側範例所示,導航 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
  }()

請參閱以下範例。畫面會因 UI 的實作方式而異,螢幕截圖僅用於說明隱藏 MapView 的效果:

alt_text alt_text
導航進行中,裝置為:

iOS 範例應用程式

無頭模式下的相同應用程式

導入注意事項

無螢幕模式只是將導航地圖從螢幕上隱藏,因此只會節省螢幕時間,進而延長裝置的電池續航力。不過,由於 Navigation SDK 會繼續執行,因此位置資訊更新和所有事件回呼都會正常觸發,使用這項設定不會產生副作用。

結論

本文將說明 Nav SDK 的彈性,以及在不同作業系統的限制下,我們可以達成哪些目標。顧客也能自訂駕駛體驗,避免分心並提升安全性。

其他資源

如果基於上述原因,必須在導航期間停用通知,也可以達成此目的,請參閱「在 Nav SDK 中修改即時路線導航通知」。