ターンバイターン方式のデータフィードは、地図ベースのナビゲーション ガイダンス用に設計されていないデバイスにナビゲーション専用の情報を提供します。提供される次の操作には、お客様が指定した要素が含まれます。
- アイコン(左、右、U ターン)
- 環状交差点の出口番号
- 道路名
- 次のナビゲーション ステップまたは最終目的地までの推定距離と時間
ターンバイターン方式のフィードを使用すると、Android Auto や、完全な Android スタックを利用できない小画面ディスプレイなど、Navigation SDK の完全な UI が適切でない場合のエクスペリエンスを作成できます。たとえば、二輪車の運転者向けに、ナビゲーション専用のガイダンスを投影して、最小限の注意散漫で目的地にすばやく確実に到着できるようにします。
SDK を使用するには、サービスを作成して Navigation SDK for Android に登録し、新しいナビゲーション情報をリアルタイムで(ナビゲーション中は 1 秒に 1 回程度)受信できるようにします。
このドキュメントでは、SDK からナビゲーション情報を受信し、受信デバイスにナビゲーション状態を提供するナビゲーション サービスを作成して登録する方法について説明します。
概要
このセクションでは、ターンバイターン方式の機能を有効にするための大まかな流れについて説明します。
TurnByTurn 機能を使用する
ターンバイターン方式の機能を有効にするための大まかな手順は次のとおりです。以降のセクションでは、各ステップの詳細について説明します。
ナビゲーションの更新情報を受信するサービスを作成する
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は、ナビゲーションが進行中だが、 ナビゲーターが新しいルートを探していることを意味します。まだ新しいルートがないため、次の操作ステップは利用できません。サンプルアプリでは、"ルートを再設定しています..."というメッセージが ナビゲーション情報表示に表示されます。ルートが見つかると、状態がENROUTEのNavInfoメッセージが送信されます。停止 -
STOPPEDは、ナビゲーションが終了したことを意味します。たとえば、ユーザーがアプリでナビゲーションを終了すると、ナビゲーションが停止します。サンプルアプリでは、STOPPED状態になるとナビゲーション情報表示がクリアされ、ステップの指示が残らないようにします。
フィード表示にデータを入力する
ターンバイターン方式のサービスを設定したので、このセクションでは、ターンバイターン方式のフィードのガイダンス カードにデータを入力するために使用できるビジュアル要素とテキスト要素について説明します。
ナビゲーション カードの情報フィールド
ユーザーがガイド付きナビゲーションを開始すると、上部にナビゲーション カードが表示されます。このカードには、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 は、操作が左側通行か右側通行か検出して、適切な操作を出力します。そのため、操作アイコンは、時計回りの操作と反時計回りの操作で異なる場合があります。
展開して、さまざまな操作のアイコンの例を表示する
| サンプルアイコン | TurnByTurn の操作 |
|---|---|
![]() |
DEPARTUNKNOWN |
![]() |
STRAIGHTON_RAMP_UNSPECIFIEDOFF_RAMP_UNSPECIFIEDNAME_CHANGE
|
![]() |
TURN_RIGHTON_RAMP_RIGHT
|
![]() |
TURN_LEFTON_RAMP_LEFT
|
![]() |
TURN_SLIGHT_RIGHTON_RAMP_SLIGHT_RIGHTOFF_RAMP_SLIGHT_RIGHT
|
![]() |
TURN_SLIGHT_LEFTON_RAMP_SLIGHT_LEFTOFF_RAMP_SLIGHT_LEFT
|
![]() |
TURN_SHARP_RIGHTON_RAMP_SHARP_RIGHTOFF_RAMP_SHARP_RIGHT
|
![]() |
TURN_SHARP_LEFTON_RAMP_SHARP_LEFTOFF_RAMP_SHARP_LEFT
|
![]() |
TURN_U_TURN_COUNTERCLOCKWISEON_RAMP_U_TURN_COUNTERCLOCKWISEOFF_RAMP_U_TURN_COUNTERCLOCKWISE
|
![]() |
TURN_U_TURN_CLOCKWISEON_RAMP_U_TURN_CLOCKWISEOFF_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_RIGHTOFF_RAMP_RIGHT
|
![]() |
MERGE_LEFTOFF_RAMP_LEFT
|
![]() |
FORK_RIGHTTURN_KEEP_RIGHTON_RAMP_KEEP_RIGHTOFF_RAMP_KEEP_RIGHT
|
![]() |
FORK_LEFTTURN_KEEP_LEFTON_RAMP_KEEP_LEFTOFF_RAMP_KEEP_LEFT
|
![]() |
MERGE_UNSPECIFIED
|
![]() |
DESTINATION
|
![]() |
DESTINATION_RIGHT
|
![]() |
DESTINATION_LEFT
|
![]() |
FERRY_BOAT
|
![]() |
FERRY_TRAIN
|
生成されたアイコンを使用する
Navigation SDK は、Android Auto のユースケースを容易にするため、操作アイコンと車線案内アイコンの生成をサポートしています。これらのアイコンは、500 x 74 dp の境界ボックスをターゲットにすることをおすすめする Android Auto Car App ライブラリの画像サイズ設定ガイドラインに適合しています。詳しくは、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 フィールドにアイコンを入力します。
次のステップ
- Android Auto アプリの場合:
- 地図を描画して ナビゲーションを有効にします。







































