Nav SDK - ヘッドレス モード

はじめに

Navigation SDK(Nav SDK)は、お客様やドライバー、特に新しいドライバーや地域に詳しくないドライバーにとって非常に役立つ、クラス最高のターンバイターン機能を備えています。ただし、企業によっては、ターンバイターン ナビゲーション UI でドライバーの注意を道路からそらしたくないが、車両の位置を追跡し、走行ルートに関連するイベントをリッスンしたいという特定のユースケースがあります。たとえば、トラックの運転手(特に危険物を輸送している場合)は、短距離の徒歩など、異なる方法で配達を行う他の企業も、ターンバイターンを有効にする必要がない場合があり、その場合はデバイスのバッテリー駆動時間を節約できます。

スコープ

このドキュメントでは、企業が Navigation SDK からナビゲーション マップ(ビュー)を非表示にしながら、位置情報の追跡、イベント サブスクリプション、コールバックに関する Nav SDK のすべての機能を活用する方法について説明します。ヘッドレス モードで Nav SDK から取得したデータは、車両の追跡機能と到着予定時刻の把握機能をより正確に改善するために使用できます。これにより、最終的に透明性と効率性が向上します。

Navigation SDK は、ドライバー アプリに追加されるネイティブの Android / iOS ライブラリです。モビリティのコンテキストでは、次の役割を果たします。

  • 実行中のアプリから道路にスナップされた位置情報を取得します。道路にスナップされた位置情報は、Google の道路ネットワークを使用して位置情報を最寄りの道路セグメントにスナップするため、Android の FusedLocationProvider(FLP)よりも正確です。これにより、FLP からの到着予定時刻などの情報がはるかに正確になります。
  • リアルタイムの交通状況やその他のルート制限を考慮して、ドライバーが A 地点から B 地点まで効率的に移動できるターンバイターンのルート案内。
  • イベント リスナーと登録されたコールバックを介して、ルートの進行状況、位置、速度などに基づいてイベントをトリガーします。

デフォルトで使用

お客様が Nav SDK を実装する場合、ターンバイターン機能が必要であると想定されます。そのため、Nav SDK のドキュメント(AndroidiOS)では、ターンバイターンを有効にして Nav SDK を実装する方法について説明しています。

Android では、アプリでターンバイターン方式の地図をレンダリングするために SupportNavigationFragment または NavigationView が使用されますが、iOS では GMSMapView が使用されます。これらの UI 要素は、インタラクティブな地図とターンバイターン方式のナビゲーション UI をアプリに追加します。

次のセクションでは、Android と iOS の両方で、ターンバイターン ナビゲーションが有効になっているデフォルトの Nav SDK コードとヘッドレス Nav SDK コードを比較し、必要な変更点を説明します。

解決策

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);

ご覧のとおり、ビューはナビゲーション エクスペリエンスの描画に使用するレイアウトを指しています。この場合、NavigationView ではなく SupportNavigationFragment が作成されます。

Nav SDK をヘッドレス モードで起動するには、この 2 つの命令を削除するだけです。ヘッドレスと非ヘッドレス(アクティブ ナビゲーション)を切り替える場合は、変数を使用してヘッドレスを使用する必要があるかどうかを判断できます。例:

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 を使用している場合

上の右側の例に示すように、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
  }()

画面の表示例をご覧ください。画面は UI の実装方法によって異なります。このスクリーンショットは、mapView を非表示にした場合の効果を示すためのものです。

alt_text alt_text
アクティブなナビゲーションが実行されている

iOS サンプルアプリ

ヘッドレス モードの同じアプリ

導入の際の留意事項(英語記事)

ヘッドレス モードはナビゲーション マップを画面から非表示にするだけなので、画面時間のみが保存され、デバイスのバッテリー駆動時間が長くなります。ただし、Nav SDK は引き続き実行されるため、位置情報の更新とすべてのイベント コールバックは通常どおりトリガーされます。そのため、この構成を使用しても副作用はありません。

まとめ

このドキュメントでは、Nav SDK の柔軟性と、さまざまなオペレーティング システムの制限を踏まえて実現できることについて説明します。また、お客様はドライバー エクスペリエンスをカスタマイズして、気を散らすものを避け、安全性を高めることもできます。

参考情報

前述の理由により、ナビゲーション中に通知を無効にする必要がある場合も、Nav SDK でターンバイターンの通知を変更するを参照して、無効にすることができます。