Wykrywaj zdarzenia nawigacji

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

Omówienie

Aby nasłuchiwać zdarzeń nawigacji, użyj tych interfejsów:

Wyświetlanie kodu

Wykrywanie przybycia do miejsca docelowego

Tutaj „miejsce docelowe” oznacza miejsce docelowe lub punkt pośredni. Aby wykryć przybycie, wywołaj funkcję Navigator.addArrivalListener(), która rejestruje wywołanie zwrotne, gdy urządzenie dotrze do miejsca docelowego.

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

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

Aby uniknąć wycieków 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();
        }
    }
});

otrzymywać powiadomienia o zmianach lokalizacji.

Uzyskaj RoadSnappedLocationProviderNavigationApi, a potem zadzwoń pod numer RoadSnappedLocationProvider.addLocationListener(), aby zarejestrować się na oddzwonienie, gdy zmieni się lokalizacja lub kierunek urządzenia. Pamiętaj, że ta lokalizacja jest przypięta do drogi, więc może się różnić od lokalizacji zwróconej przez połączonego dostawcę lokalizacji w interfejsach API lokalizacji Usług Google Play.

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

Aktualizacje lokalizacji przypisanych do dróg są niezależne od nawigacji i mogą być kontynuowane nawet po zatrzymaniu nawigacji. Subskrybowanie aktualizacji lokalizacji może spowodować rozładowanie baterii, wyciek pamięci lub niezamierzone zbieranie danych o lokalizacji urządzenia, jeśli aktualizacje lokalizacji będą działać w tle. Wywołaj polecenie RoadSnappedLocationProvider.removeLocationListener, gdy nie potrzebujesz już detektora.

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

otrzymywać informacje o czasie i odległości;

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

Gdy zmiana czasu lub odległości przekroczy określoną wartość, Navigation SDK wywoła funkcję zwrotną onRemainingTimeOrDistanceChanged().

Aby sprawdzić pozostały czas i dystans, wywołaj Navigator.getTimeAndDistanceList(). Pamiętaj, że czasy i odległości na liście są skumulowane: pokazują czas i odległość od bieżącej lokalizacji do każdego punktu kontrolnego, a nie od jednego punktu do drugiego. Obiekt TimeAndDistance zwraca teraz także delaySeverity. To enum będzie albo obfite, środkowe, lekkie albo nieznane. Odpowiada on kolorowi, który widzisz w etapie w interfejsie Map (intensywny = czerwony, średni = żółty, jasny = 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.

Przykład poniżej prosi o połączenie zwrotne, jeśli pozostały czas zmieni się o więcej niż 60 sekund lub pozostała odległość o więcej niż 100 metrów.

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

Możesz wyświetlać informacje o pozostałym czasie i odległości za pomocą wbudowanego wyświetlacza, korzystając z metody setEtaCardEnabled() i przekazując parametr o wartości TRUE. Aby wyłączyć wyświetlanie czasu i odległości, ustaw tę wartość na FALSE.

Czas dojazdu do wielu punktów pośrednich możesz też wyświetlić, używając metody getTimeAndDistanceList().

Otrzymuj aktualne informacje o trasie

Zadzwoń pod numer Navigator.addRouteChangedListener(), aby zarejestrować się na wywołanie zwrotne po zmianie trasy.

Gdy trasa się zmieni, Navigation SDK wywoła funkcję onRouteChanged(). Aby poznać nową trasę, zadzwoń pod numer Navigator.getRouteSegments lub Navigator.getCurrentRouteSegment().

Aby uniknąć wycieków pamięci, musisz wywołać funkcję removeRouteChangedListener(listener), gdy nie będziesz już potrzebować listenera.

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

Wykrywanie zmian trybu nocnego

Zadzwoń pod numer NavigationView.addOnNightModeChangedListener lub SupportNavigationFragment.addOnNightModeChangedListener, aby zarejestrować się na oddzwonienie po zmianie trybu nocnego.

Ten przykład pokazuje nasłuchiwanie zmian trybu nocnego we fragmencie nawigacji.

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

Tryb nocny możesz też ustawić automatycznie. Więcej informacji znajdziesz w artykule Ustawianie trybu nocnego.