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

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

  • アイコン(左折、右折、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 クラスの Message.what フィールドで識別できます。このフィールドは TurnByTurnManager.MSG_NAV_INFO の値に設定されます。

ナビゲーションの更新のためにサービスを登録する

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

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

サービスの開始と停止

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

サービスの登録解除

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

navigator.unregisterServiceForNavUpdates();

ナビゲーションの状態を理解する

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

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

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

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

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

ターンバイターン サービスを設定したら、このセクションで説明する視覚要素とテキスト要素を使用して、ターンバイターン フィードのガイダンス カードに情報を入力できます。

100 フィート先で W Ahwanee Ave に左折することを示すモバイル画面。画面の下部には、目的地までの残り時間が 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_LEFT や DESTINATION_RIGHT などのアイコンに 1 対 1 のマッピングを設定できます。ただし、一部の操作は類似しているため、複数の操作を 1 つのアイコンにマッピングすることもできます。たとえば、TURN_LEFT と ON_RAMP_LEFT の両方を左折アイコンにマッピングできます。

一部の操作には、追加の clockwise ラベルまたは counterclockwise ラベルが含まれています。これは、SDK が国の運転側に基づいて決定します。たとえば、左側通行の国では、ドライバーは時計回りにラウンドアバウトまたは U ターンを行いますが、右側通行の国では時計回りになります。Navigation SDK は、左側通行または右側通行で操作が行われるかどうかを検出し、適切な操作を出力します。そのため、時計回りと反時計回りの操作では、操作アイコンが異なる場合があります。

開いて、さまざまな操作のアイコンの例を表示

サンプル アイコン ターンバイターン方式の操作
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 で提供される生成されたアイコンの短いリスト。

Android Auto のユースケースを容易にするため、ナビゲーション SDK は、操作アイコンと車線案内アイコンの生成をサポートしています。これらのアイコンは、Android Auto 自動車向けアプリ ライブラリの画像サイズ設定ガイダンスに適合しています。このガイダンスでは、500 x 74 dp の境界ボックスをターゲットにすることを推奨しています。詳しくは、Android リファレンス ドキュメントの setsLaneImage と CarIcon をご覧ください。

アイコン生成の例

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 フィールドにアイコンが入力されます。

次のステップ