ターンバイターン方式のデータフィードを有効にする

ターンバイターン方式のデータフィードは、地図ベースのナビゲーション ガイダンス用に設計されていないデバイスにナビゲーション専用の情報を提供します。提供される次の操作には、お客様が指定した要素が含まれます。

  • アイコン(左、右、U ターン)
  • 環状交差点の出口番号
  • 道路名
  • 次のナビゲーション ステップまたは最終目的地までの推定距離と時間

ターンバイターン方式のフィードを使用すると、Android Auto や、完全な Android スタックを利用できない小画面ディスプレイなど、Navigation SDK の完全な UI が適切でない場合のエクスペリエンスを作成できます。たとえば、二輪車の運転者向けに、ナビゲーション専用のガイダンスを投影して、最小限の注意散漫で目的地にすばやく確実に到着できるようにします。

SDK を使用するには、サービスを作成して Navigation SDK for Android に登録し、新しいナビゲーション情報をリアルタイムで(ナビゲーション中は 1 秒に 1 回程度)受信できるようにします。

このドキュメントでは、SDK からナビゲーション情報を受信し、受信デバイスにナビゲーション状態を提供するナビゲーション サービスを作成して登録する方法について説明します。

概要

このセクションでは、ターンバイターン方式の機能を有効にするための大まかな流れについて説明します。

TurnByTurn 機能を使用する

ターンバイターン方式の機能を有効にするための大まかな手順は次のとおりです。以降のセクションでは、各ステップの詳細について説明します。

  1. ナビゲーションの更新情報を受信するサービスを作成します

  2. サービスを登録します

  3. ナビゲーションの状態を把握します

ナビゲーションの更新情報を受信するサービスを作成する

Navigation SDK は TurnByTurn サービスにバインドし、 ナビゲーションの更新情報を Android Messenger を介して送信します。これらの更新情報用に新しいナビゲーション サービスを作成することも、既存のサービスを使用することもできます。

サービスを使用してナビゲーションの更新情報を受信するメリットは、サービスを別のバックグラウンド プロセスで実行できることです。

次の例のサービスは、ナビゲーション情報を受信し、TurnByTurnManager を使用してデータをナビゲーションの詳細を含む NavInfo オブジェクトに変換します。

/**
 *   Receives turn-by-turn navigation information forwarded from NavSDK.
 */
public class NavInfoReceivingService extends Service {
  /** The messenger used by the service to receive nav step updates. */
  private Messenger incomingMessenger;
  private TurnByTurnManager turnByTurnManager;

  private final class IncomingNavStepHandler extends Handler {
    public IncomingNavStepHandler(Looper looper) {
      super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
      // Identify the message through the msg.what field.
      if (TurnByTurnManager.MSG_NAV_INFO == msg.what) {
        // Extract the NavInfo object using the TurnByTurnManager.
        NavInfo navInfo = turnByTurnManager
          .readNavInfoFromBundle(msg.getData()));
      // Do something with the NavInfo
    }
  }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
  return incomingMessenger.getBinder();
}

@Override
public void onCreate() {
  turnByTurnManager = TurnByTurnManager.createInstance();
  HandlerThread thread =
    new HandlerThread("NavInfoReceivingService",
      Process.THREAD_PRIORITY_DEFAULT);
  thread.start();
  incomingMessenger = new Messenger(
    new IncomingNavStepHandler(thread.getLooper()));
}

メッセージ コード

NavInfo メッセージは、 Message.what Message クラスのフィールドで識別できます。このフィールドは TurnByTurnManager.MSG_NAV_INFO の値に設定されます。

ナビゲーションの更新情報を受信するサービスを登録する

次のコード スニペットは、ナビゲーション サービスを登録します。

boolean isNavInfoReceivingServiceRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(), NavInfoReceivingService.class.getName(), numNextStepsToPreview);

サービスの開始と停止

ナビゲーション サービスは、Navigation SDK がバインドされている限りアクティブです。startService()stopService() を手動で呼び出してナビゲーション サービスのライフサイクルを制御できますが、Navigation SDK にサービスを登録すると、サービスは自動的に開始され、登録を解除するまで停止しません。アプリの設定によっては、Android ドキュメントのサービスの 概要で説明されているフォアグラウンド サービスの開始を検討することをおすすめします。

サービスの登録を解除する

ナビゲーションの更新情報の受信を停止するには、Navigation SDK からサービスの登録を解除します。

navigator.unregisterServiceForNavUpdates();

ナビゲーションの状態を把握する

NavInfo.getNavState() を使用して、ナビゲーションの現在の状態を取得します。これは次のいずれかになります。

  • Enroute - ENROUTE 状態は、ガイド付きナビゲーションが アクティブで、ユーザーが提供されたルート上にいることを意味します。現在の次の操作ステップに関する情報が利用可能です。

  • Rerouting - REROUTING は、ナビゲーションが進行中だが、 ナビゲーターが新しいルートを探していることを意味します。まだ新しいルートがないため、次の操作ステップは利用できません。サンプルアプリでは、"ルートを再設定しています..."というメッセージが ナビゲーション情報表示に表示されます。ルートが見つかると、状態が ENROUTENavInfo メッセージが送信されます。

  • 停止 - STOPPED は、ナビゲーションが終了したことを意味します。たとえば、ユーザーがアプリでナビゲーションを終了すると、ナビゲーションが停止します。サンプルアプリでは、STOPPED 状態になるとナビゲーション情報表示がクリアされ、ステップの指示が残らないようにします。

フィード表示にデータを入力する

ターンバイターン方式のサービスを設定したので、このセクションでは、ターンバイターン方式のフィードのガイダンス カードにデータを入力するために使用できるビジュアル要素とテキスト要素について説明します。

W Ahwanee Ave まで 100 フィートで左折する予定が表示されているモバイル画面。画面の下部には、目的地までの残り時間が 46 分、残り距離が 39 マイルと表示されています。

ユーザーがガイド付きナビゲーションを開始すると、上部にナビゲーション カードが表示されます。このカードには、Navigation SDK から入力されたナビゲーション データが含まれています。関連する画像は、これらの重要なナビゲーション要素の例を示しています。

次の表に、ナビゲーション情報のフィールドとその場所を示します。

各ナビゲーション ステップのフィールド ルート全体のフィールド
StepInfo にあります NavInfo にあります
道路の完全な名前 残り時間
操作アイコン 目的地までの距離
次のステップまでの距離
車線案内のフィールド

車線案内

Navigation SDK は、ナビゲーション ターンカードの車線を Lane データオブジェクトと LaneDirection データオブジェクトとして表します。Lane オブジェクトは、ナビゲーション中の特定の車線を表し、 LaneDirection オブジェクトのリストを持ち、この車線から行えるすべてのターンを記述します。

車線案内構成の例。

車線でユーザーが取るべき推奨方向は、 isRecommended フィールドで示されます。

車線案内の例

次のスニペットは、上に表示される車線のデータ表現を示しています。

// Lane 1
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false},
                  {/*laneShape=*/ SLIGHT_LEFT, /*isRecommended=*/ true}]

// Lane 2
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false}]

操作のアイコンを作成する

Maneuver 列挙型は、ナビゲーション中に発生する可能性のある各操作を定義します。特定のステップの操作は、StepInfo.getManeuver() メソッドから取得できます。

操作アイコンを作成し、関連する操作とペアにする必要があります。 DESTINATION_LEFTDESTINATION_RIGHT など、一部の操作では、アイコンへの 1 対 1 のマッピングを設定できます。ただし、一部の操作は似ているため、複数の操作を 1 つのアイコンにマッピングすることをおすすめします。たとえば、TURN_LEFTON_RAMP_LEFT はどちらも左折アイコンにマッピングできます。

一部の操作には、clockwise または counterclockwise のラベルが追加されています。 このラベルは、SDK が国の運転側に基づいて決定します。たとえば、道路の左側を走行する国では、運転者は環状交差点や U ターンを時計回りに走行しますが、道路の右側を走行する国では時計回りに走行します。Navigation SDK は、操作が左側通行か右側通行か検出して、適切な操作を出力します。そのため、操作アイコンは、時計回りの操作と反時計回りの操作で異なる場合があります。

展開して、さまざまな操作のアイコンの例を表示する

サンプルアイコン TurnByTurn の操作
DEPART
UNKNOWN
STRAIGHT
ON_RAMP_UNSPECIFIED
OFF_RAMP_UNSPECIFIED
NAME_CHANGE
TURN_RIGHT
ON_RAMP_RIGHT
TURN_LEFT
ON_RAMP_LEFT
TURN_SLIGHT_RIGHT
ON_RAMP_SLIGHT_RIGHT
OFF_RAMP_SLIGHT_RIGHT
TURN_SLIGHT_LEFT
ON_RAMP_SLIGHT_LEFT
OFF_RAMP_SLIGHT_LEFT
TURN_SHARP_RIGHT
ON_RAMP_SHARP_RIGHT
OFF_RAMP_SHARP_RIGHT
TURN_SHARP_LEFT
ON_RAMP_SHARP_LEFT
OFF_RAMP_SHARP_LEFT
TURN_U_TURN_COUNTERCLOCKWISE
ON_RAMP_U_TURN_COUNTERCLOCKWISE
OFF_RAMP_U_TURN_COUNTERCLOCKWISE
TURN_U_TURN_CLOCKWISE
ON_RAMP_U_TURN_CLOCKWISE
OFF_RAMP_U_TURN_CLOCKWISE
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_RIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
ROUNDABOUT_STRAIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_LEFT_CLOCKWISE
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
ROUNDABOUT_U_TURN_CLOCKWISE
ROUNDABOUT_COUNTERCLOCKWISE
ROUNDABOUT_CLOCKWISE
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
ROUNDABOUT_EXIT_CLOCKWISE
MERGE_RIGHT
OFF_RAMP_RIGHT
MERGE_LEFT
OFF_RAMP_LEFT
FORK_RIGHT
TURN_KEEP_RIGHT
ON_RAMP_KEEP_RIGHT
OFF_RAMP_KEEP_RIGHT
FORK_LEFT
TURN_KEEP_LEFT
ON_RAMP_KEEP_LEFT
OFF_RAMP_KEEP_LEFT
MERGE_UNSPECIFIED
DESTINATION
DESTINATION_RIGHT
DESTINATION_LEFT
FERRY_BOAT
FERRY_TRAIN

生成されたアイコンを使用する

Navigation SDK によって提供される生成済みアイコンの小さなリスト。

Navigation SDK は、Android Auto のユースケースを容易にするため、操作アイコンと車線案内アイコンの生成をサポートしています。これらのアイコンは、500 x 74 dp の境界ボックスをターゲットにすることをおすすめする Android Auto Car App ライブラリの画像サイズ設定ガイドラインに適合しています。詳しくは、Android リファレンス ドキュメントの setsLaneImageCarIcon をご覧ください。

アイコン生成の例

NavigationUpdatesOptions options =
  NavigationUpdatesOptions.builder()
             .setNumNextStepsToPreview(numNextStepsToPreview)
             .setGeneratedStepImagesType(GeneratedStepImagesType.BITMAP)
             .setDisplayMetrics(getResources().getDisplayMetrics())
             .build();
boolean isRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(),
              NavInfoReceivingService.class.getName(),
              options);

アイコンの生成を有効にすると、TurnbyTurn StepInfo オブジェクトは maneuverBitmap フィールドと lanesBitmap フィールドにアイコンを入力します。

次のステップ