Ascolta gli eventi di navigazione

La tua app può ascoltare gli eventi che si verificano mentre l'utente naviga lungo un percorso.

Panoramica

Utilizza le seguenti interfacce per ascoltare gli eventi di navigazione:

Visualizza il codice

Rileva l'arrivo a una destinazione

In questo caso, per destinazione si intende una destinazione finale o una tappa. Per rilevare l'arrivo, chiama il numero Navigator.addArrivalListener(), che registra un callback quando il dispositivo raggiunge una destinazione.

All'arrivo, l'SDK di navigazione per Android attiva il callback onArrival() e interrompe le indicazioni passo passo. Devi richiamare esplicitamente Navigator.continueToNextDestination() per passare alla tappa successiva e Navigator.startGuidance() per continuare la navigazione passo passo.

Quando chiami continueToNextDestination(), il navigatore scarta tutte le informazioni sulla destinazione precedente. Se vuoi analizzare le informazioni sul tratto di route precedente, devi recuperarle dal navigatore prima di chiamare continueToNextDestination().

Per evitare fughe di memoria, devi chiamare removeArrivalListener(listener) quando non hai più bisogno del 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();
        }
    }
});

Ricevi aggiornamenti sulla posizione

Ottieni un RoadSnappedLocationProvider da NavigationApi, quindi chiama il numero RoadSnappedLocationProvider.addLocationListener() per registrarti e farti richiamare quando la posizione o l'intestazione del dispositivo cambia. Tieni presente che questa posizione è agganciata a una strada, quindi potrebbe essere diversa da quella restituita dal fornitore di servizi di posizione integrato nelle API di geolocalizzazione di Google Play Services.

L'SDK di navigazione fornisce aggiornamenti sulla posizione con la massima frequenza possibile. Quando è disponibile un aggiornamento della posizione, l'SDK di navigazione attiva il callback onLocationChanged().

Gli aggiornamenti sulla posizione sincronizzati sulla strada sono indipendenti dalla navigazione e possono continuare anche dopo l'interruzione della navigazione. L'abbonamento agli aggiornamenti della posizione può causare un consumo della batteria, una perdita di memoria o la raccolta accidentale di dati sulla posizione del dispositivo se gli aggiornamenti della posizione sono in esecuzione in background. Chiama RoadSnappedLocationProvider.removeLocationListener quando non hai più bisogno dell'ascoltatore.

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);
}

Ricevi aggiornamenti su tempi e distanza

Chiama il numero Navigator.addRemainingTimeOrDistanceChangedListener() per registrarti per una richiamata quando il tempo rimanente (secondi) o la distanza (metri) cambia di una determinata soglia.

Quando la variazione di tempo o distanza supera l'importo specificato, l'SDK di navigazione attiva il callback onRemainingTimeOrDistanceChanged().

Per trovare il tempo e la distanza rimanenti, chiama il numero Navigator.getTimeAndDistanceList(). Tieni presente che i tempi e le distanze nell'elenco sono cumulativi: mostrano il tempo e la distanza tra la posizione corrente e ogni tappa, non da una tappa all'altra. L'oggetto TimeAndDistance ora restituisce anche delaySeverity. L'enumerazione sarà pesante, media, leggera o sconosciuta. Corrisponde al colore che vedi sull'orario di arrivo stimato nell'interfaccia utente di Maps (pesante = rosso, medio = giallo, chiaro = verde). Questa operazione è utile se devi creare un tuo piè di pagina ETA.

Per evitare fughe di memoria, devi chiamare Navigator.removeRemainingTimeOrDistanceChangedListener(listener) quando non hai più bisogno del listener.

Nell'esempio seguente viene chiesto di essere richiamato se il tempo rimanente cambia di oltre 60 secondi o se la distanza rimanente supera i 100 metri.

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

Puoi mostrare le informazioni su tempo rimanente e distanza utilizzando il display integrato usando il metodo setEtaCardEnabled() e trasmettendo un parametro con il valore TRUE. Per sopprimere la visualizzazione di tempo/distanza, imposta questo valore su FALSE.

Puoi anche esporre l'orario di arrivo stimato per più tappe utilizzando il metodo getTimeAndDistanceList().

Ricevi aggiornamenti sui percorsi

Chiama il numero Navigator.addRouteChangedListener() per registrarti a un callback quando il percorso cambia.

Quando il percorso cambia, l'SDK di navigazione attiva il callback onRouteChanged(). Puoi chiamare Navigator.getRouteSegments e Navigator.getCurrentRouteSegment() per trovare la nuova route.

Per evitare fughe di memoria, devi chiamare removeRouteChangedListener(listener) quando non hai più bisogno del 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);
    }
});

Rileva il cambio della modalità notturna

Chiama il numero NavigationView.addOnNightModeChangedListener o SupportNavigationFragment.addOnNightModeChangedListener per registrarti per una richiamata quando la modalità notturna cambia.

L'esempio seguente mostra l'ascolto delle modifiche alla modalità notturna in un frammento di navigazione.

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