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

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

  • アイコン(左、右、U ターン)
  • ロータリーで番号を変える
  • 道路名
  • 次のナビゲーション ステップまたは最終目的地までの推定距離と時間

ターンバイターン フィードを使用すると、Android Auto や、完全な Android スタックが利用できない小さな画面の表示など、完全な Navigation SDK UI が適さないエクスペリエンスを作成できます。たとえば、二輪車のドライバーにこれを使用すると、ナビゲーションのみのガイダンスを投影し、注意散漫になる危険を最小限に抑えながら、より迅速かつ確実に目的地に到着できるようになります。

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

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

概要

このセクションでは、TurnByTurn ライブラリをプロジェクトに追加する方法と、ターンバイターン機能を作成する大まかなフローについて概説します。

スタンドアロン版の TurnByTurn ライブラリを使用する手順は次のとおりです。

  1. ホスト Maven リポジトリにアクセスするように環境を設定します。

    Maven

    次のコードを pom.xml ファイルに追加します。

        <project>
          ...
          <repositories>
            <repository>
              <id>google-maven-repository</id>
              <url>https://maven.google.com</url>
            </repository>
          </repositories>
          ...
        </project>
        
        

    Gradle

    次のコードを build.gradle ファイルに追加します。

    repositories {
        ...
        google()
    }
        
  2. Maven または Gradle の構成に次の依存関係を追加します。
  3. Maven

    <dependencies>
    ...
    <dependency>
          <groupId>com.google.android.maps</groupId>
          <artifactId>google_turnbyturn</artifactId>
          <version>1.0.0</version>
    </dependency>
    </dependencies>
        
        

    Gradle

    dependencies {
      ...
      implementation 'com.google.android.maps:google_turnbyturn:1.0.0'
    }
        

ダウンロードした JAR ファイルを使用してプロジェクトに TurnByTurn ライブラリを追加する(別の方法)

TurnByTurn ライブラリは、この SDK フォルダ内の JAR ファイルとして入手できます。アクセス権がない場合は、担当者にお問い合わせください。

  1. google_turnbyturn_*.jar をダウンロードして解凍します。
  2. ダウンロードした JAR ファイルをプロジェクトの app/libs ディレクトリにコピーします。
  3. 次のコードを build.gradle に追加して、JAR をビルドに含めます。

    dependencies {
       ...
       api fileTree(include: ['*.jar'], dir: 'libs')
    }
    

TurnByTurn ライブラリの使用

ターンバイターン機能を有効にする手順の概要は次のとおりです。以降のセクションでは、各ステップについて詳しく説明します。

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

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

  3. ナビゲーション状態について

  4. 重要な要素を示すナビゲーション表示の例をご覧ください

ナビゲーションの更新を受け取るサービスを作成する

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() を手動で呼び出してナビゲーション サービスのライフサイクルを制御できますが、Navigation SDK を使用してサービスを登録すると、サービスが自動的に開始され、登録解除するとのみ停止します。アプリのセットアップ方法によっては、フォアグラウンド サービスを開始することをおすすめします。詳しくは、Android ドキュメントのサービスの概要をご覧ください。

サービスの登録解除

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

navigator.unregisterServiceForNavUpdates();

ナビゲーション状態について

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

  • 配送中 - ENROUTE 状態は、ガイド付きナビゲーションが有効であり、ユーザーが指定された経路を進んでいることを意味します。現在の操作ステップに関する情報が利用可能です。

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

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

フィードの表示内容を入力する

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

ワット アワニー アベニューの 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 は、操作が左側と右側のどちらのトラフィックで発生するかを検出し、適切な操作を出力します。そのため、時計回りと反時計回りで操作アイコンが異なる場合があります。

展開してさまざまな操作のサンプル アイコンを見る

サンプル アイコン ターンバイターン方式の操作
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 のユースケースを容易にするために、Navigation SDK は、操作アイコンと車線案内アイコンの生成をサポートしています。これらのアイコンは、500 x 74 dp の境界ボックスをターゲットにすることが推奨される Android Auto 自動車アプリ ライブラリの画像サイズのガイダンスに適合しています。詳しくは、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 フィールドにアイコンが入力されます。

次のステップ