ナビゲーション イベントをリッスンする

アプリは、ユーザーがルートに沿って移動する際に発生するイベントをリッスンできます。

概要

ナビゲーション イベントをリッスンするには、次のインターフェースを使用します。

  • Navigator.ArrivalListener は、デバイスが目的地に到着したときにトリガーされる onArrival() コールバックを提供します。
  • RoadSnappedLocationProvider.LocationListener は、デバイスの位置が変更されたときにトリガーされる onLocationChanged() コールバックを提供します。
  • Navigator.RemainingTimeOrDistanceChangedListener は、次の目的地までの時間または距離が指定された量を超えて変化したときにトリガーされる onRemainingTimeOrDistanceChanged() コールバックを提供します。
  • Navigator.RouteChangedListener は、ルートが変更されたときにトリガーされる onRouteChanged() コールバックを提供します。

コードの確認

目的地への到着を検出する

ここで、目的地とは最終目的地または経由地を指します。到着を検出するには、Navigator.addArrivalListener() を呼び出します。これにより、デバイスが目的地に到着したときにコールバックが登録されます。

到着すると、Android 向け Navigation SDK は onArrival() コールバックを起動します。このコールバックを使用して、 ターンバイターン方式の経路案内をNavigator.stopGuidance() で停止するか、 次の経由地を Navigator.continueToNextDestination() で進むことができます。ナビゲーション セッションに目的地が 1 つしかない場合や、目的地のリストに目的地が残っていない場合は、 Navigator.continueToNextDestination() を呼び出すと、経路案内が自動的に停止します。

continueToNextDestination() を呼び出すと、ナビゲーターは前の目的地に関するすべての情報を破棄します。前のルートセグメントに関する情報を分析する場合は、continueToNextDestination() を呼び出す前にナビゲーターから情報を取得する必要があります。

メモリリークを回避するには、リスナーが不要になったら removeArrivalListener(listener)を呼び出す必要があります。

mNavigator.addArrivalListener(new Navigator.ArrivalListener() {
    @Override
    public void onArrival(ArrivalEvent arrivalEvent) {
        displayMessage("onArrival: You've arrived at a waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_BOTH);
        // Start turn-by-turn guidance for the next leg of the route.
        if (arrivalEvent.isFinalDestination()) {
            displayMessage("onArrival: You've arrived at the final destination.",
                    DISPLAY_BOTH);
        } else {
            mNavigator.continueToNextDestination();
            mNavigator.startGuidance();
        }
    }
});

位置情報の更新データを受信する

NavigationApi から RoadSnappedLocationProvider を取得し、 RoadSnappedLocationProvider.addLocationListener() を呼び出して、デバイスの位置または方角が変更されたときにコールバックが登録されるようにします。この位置は道路にスナップされるため、Google Play 開発者サービスの位置情報 API のFused Location Providerから返される位置とは異なる場合があります。

Navigation SDK は、可能な限り頻繁に位置情報の更新を提供します。位置情報の更新が利用可能になると、 Navigation SDK は onLocationChanged() コールバックを起動します。

道路にスナップされた位置情報の更新はナビゲーションとは独立しており、ナビゲーションが停止した後も継続できます。位置情報の更新をバックグラウンドで実行したままにすると、バッテリーの消耗、メモリリーク、デバイスの位置情報の意図しない収集が発生する可能性があります。 RoadSnappedLocationProvider.removeLocationListener リスナーが不要になったら呼び出します。

mRoadSnappedLocationProvider =
        NavigationApi.getRoadSnappedLocationProvider(getApplication());
if (mRoadSnappedLocationProvider != null) {
    mRoadSnappedLocationProvider.addLocationListener(
            new RoadSnappedLocationProvider.LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    displayMessage("onLocationUpdated: Navigation engine has provided a new"
                                    +   " road-snapped location: "
                                    +   location.toString(),
                            DISPLAY_LOG);
                }
            });
} else {
    displayMessage("ERROR: Failed to get a location provider", DISPLAY_LOG);
}

時間と距離の更新データを受信する

Navigator.addRemainingTimeOrDistanceChangedListener() を呼び出して、残り時間(秒)または距離 (メートル)が指定されたしきい値を超えて変化したときにコールバックが登録されるようにします。

時間または距離の変化が指定された量を超えると、 Navigation SDK は onRemainingTimeOrDistanceChanged() コールバックを起動します。

残り時間と距離を確認するには、 Navigator.getTimeAndDistanceList() を呼び出します。リスト内の時間と距離は累積値です。1 つのウェイポイントから別のウェイポイントまでの時間と距離ではなく、現在地から各ウェイポイントまでの時間と距離を示します。TimeAndDistance オブジェクトは delaySeverity も返すようになりました。この列挙型は、heavy、meduim、light、unknown のいずれかになります。これは、地図の UI の到着予定時刻に表示される色に対応しています(heavy = 赤、medium = 黄、light = 緑)。これは、独自の到着予定時刻フッターを作成する必要がある場合に便利です。

メモリリークを回避するには、リスナーが不要になったら Navigator.removeRemainingTimeOrDistanceChangedListener(listener) を呼び出す必要があります。

次のサンプルでは、残り時間が 60 秒以上変化した場合、または残り距離が 100 メートル以上変化した場合にコールバックをリクエストします。

mNavigator.addRemainingTimeOrDistanceChangedListener(60, 100,
        new Navigator.RemainingTimeOrDistanceChangedListener() {
            @Override
            public void onRemainingTimeOrDistanceChanged() {
                displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"
                        +   " has changed.",
                        DISPLAY_LOG);
            }
        });

残り時間と距離の情報は、組み込みの表示 を使用してsetEtaCardEnabled() メソッドを使用して表示し、 値が TRUE のパラメータを渡すことができます。時間と距離の表示を抑制するには、この値を FALSE に設定します。

getTimeAndDistanceList() メソッドを使用すると、複数の経由地の到着予定時刻を表示することもできます。

ルートの更新データを受信する

Navigator.addRouteChangedListener() を呼び出して、ルートが変更されたときにコールバックが 登録されるようにします。

ルートが変更されると、Navigation SDK は onRouteChanged() コールバックを起動します。 Navigator.getRouteSegmentsNavigator.getCurrentRouteSegment() を呼び出して、新しい ルートを確認できます。

メモリリークを回避するには、リスナーが不要になったら removeRouteChangedListener(listener)を呼び出す必要があります。

mNavigator.addRouteChangedListener(new Navigator.RouteChangedListener() {
    @Override
    public void onRouteChanged() {
        displayMessage("onRouteChanged: The driver's route has changed. Current waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_LOG);
    }
});

夜間モードが変更されたことを検出する

NavigationView.addOnNightModeChangedListener または SupportNavigationFragment.addOnNightModeChangedListener を呼び出して、夜間モードが変更されたときにコールバックが登録されるようにします。

次の例は、ナビゲーション フラグメントで夜間モードの変更をリッスンする方法を示しています。

mNavFragment.addOnNightModeChangedListener(new NavigationView.OnNightModeChangedListener() {
    @Override
    public void onNightModeChanged(NightModeChangedEvent nightModeChangedEvent) {
        displayMessage("Night mode is active: " + nightModeChangedEvent.inNightMode(),
        DISPLAY_LOG);
    }
});

夜間モードはプログラムで設定することもできます。詳細については、夜間モードを設定する をご覧ください。