Wykrywaj zdarzenia nawigacji

Aplikacja może nasłuchiwać zdarzeń, które występują, gdy użytkownik porusza się po trasie.

Przegląd

Do nasłuchiwania zdarzeń nawigacji używaj tych interfejsów:

Wyświetl kod

Wykrywanie przyjazdu do miejsca docelowego

W tym przypadku cel podróży odnosi się do ostatecznego celu podróży lub punktu pośredniego. Aby wykryć przyjazd, wywołaj metodę Navigator.addArrivalListener(), która rejestruje wywołanie zwrotne, gdy urządzenie dotrze do miejsca docelowego.

Po dotarciu do celu pakiet SDK nawigacji na Androida uruchamia wywołanie zwrotne onArrival() i zatrzymuje szczegółowe wskazówki. Musisz wyraźnie wywołać metodę Navigator.continueToNextDestination(), aby przejść do następnego punktu na trasie, lub klawisz Navigator.startGuidance(), aby kontynuować nawigację zakręt po zakręcie.

Gdy wywołujesz continueToNextDestination(), nawigator odrzuca wszystkie informacje o poprzednim miejscu docelowym. Jeśli chcesz przeanalizować informacje o poprzednim segmencie trasy, musisz pobrać je z nawigatora przed wywołaniem funkcji continueToNextDestination().

Aby uniknąć wycieku pamięci, musisz wywołać removeArrivalListener(listener), gdy nie potrzebujesz już detektora.

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

Odbieraj aktualizacje lokalizacji

Uzyskaj RoadSnappedLocationProvider z NavigationApi, a następnie wywołaj RoadSnappedLocationProvider.addLocationListener(), aby zarejestrować się na oddzwonienie, gdy zmieni się lokalizacja lub nagłówek urządzenia. Ta lokalizacja jest przyciągana do drogi, więc może się różnić od lokalizacji zwracanej przez dostawcę uśrednionej lokalizacji w interfejsach API lokalizacji Usług Google Play.

Pakiet Navigation SDK zapewnia aktualizacje lokalizacji tak często, jak to możliwe. Gdy dostępna jest aktualizacja lokalizacji, pakiet SDK nawigacji uruchamia wywołanie zwrotne onLocationChanged().

Aktualizacje lokalizacji ograniczone do drogi są niezależne od nawigacji i mogą być kontynuowane nawet po zatrzymaniu nawigacji. Zasubskrybowanie aktualizacji lokalizacji może spowodować wyczerpywanie się baterii, wyciek pamięci lub niezamierzone zbieranie danych o lokalizacji urządzenia, jeśli aktualizacje lokalizacji pozostawisz w tle. Zadzwoń pod numer RoadSnappedLocationProvider.removeLocationListener, gdy nie potrzebujesz już słuchacza.

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

Otrzymuj aktualne informacje o czasie i odległości

Wywołaj metodę Navigator.addRemainingTimeOrDistanceChangedListener(), aby zarejestrować wywołanie zwrotne, gdy pozostały czas (w sekundach) lub odległość (w metrach) zmieni się o ponad określony próg.

Gdy zmiana czasu lub odległości przekracza określoną wartość, pakiet SDK nawigacji uruchamia wywołanie zwrotne onRemainingTimeOrDistanceChanged().

Aby sprawdzić pozostały czas i odległość, zadzwoń pod numer Navigator.getTimeAndDistanceList(). Pamiętaj, że czasy i odległości na liście kumulują się: pokazują czas i odległość od bieżącej lokalizacji do każdego punktu pośredniego, a nie między punktami pośrednimi. Obiekt TimeAndDistance zwraca teraz także wartość delaySeverity. Może ona być pogrubiona, średnia, lekka lub nieznana. Odpowiada to kolorowi widocznemu w eta w interfejsie map (ciężki = czerwony, średni = żółty, światło = zielony). Jest to przydatne, jeśli musisz utworzyć własną stopkę eta.

Aby uniknąć wycieków pamięci, musisz wywołać Navigator.removeRemainingTimeOrDistanceChangedListener(listener), gdy nie potrzebujesz już detektora.

W przykładzie poniżej prośba o oddzwonienie zmieni się o ponad 60 sekund lub pozostały dystans zmieni się o ponad 100 metrów.

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

Pozostały czas i dystans możesz wyświetlić za pomocą wbudowanego wyświetlacza, korzystając z metody setEtaCardEnabled() i przekazując parametr o wartości TRUE. Aby wyłączyć wyświetlanie czasu lub odległości, ustaw tę wartość na FALSE.

Możesz też udostępnić szacowany czas dotarcia dla wielu punktów na trasie za pomocą metody getTimeAndDistanceList().

Otrzymuj aktualizacje trasy

Wywołaj Navigator.addRouteChangedListener(), aby zarejestrować się na wywołanie zwrotne, gdy zmieni się trasa.

Gdy trasa się zmieni, pakiet SDK nawigacji uruchomi wywołanie zwrotne onRouteChanged(). Możesz wywołać Navigator.getRouteSegments i Navigator.getCurrentRouteSegment(), aby znaleźć nową trasę.

Aby uniknąć wycieku pamięci, musisz wywołać removeRouteChangedListener(listener), gdy nie potrzebujesz już detektora.

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

Wykrywaj zmiany trybu nocnego

Wywołaj NavigationView.addOnNightModeChangedListener lub SupportNavigationFragment.addOnNightModeChangedListener, aby zarejestrować się na wywołanie zwrotne po zmianie trybu nocnego.

Poniższy przykład pokazuje nasłuchiwanie zmian trybu nocnego we fragmencie nawigacyjnym.

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