Wykrywaj zdarzenia nawigacji

Aplikacja może odbierać zdarzenia, 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 albo miejsce docelowe, albo punkt drogi. Aby wykryć przybycie, zadzwoń pod numer Navigator.addArrivalListener(), który rejestruje wywołanie zwrotne, gdy urządzenie dotrze do celu.

Po dotarciu do celu pakiet Navigation SDK na Androida wywołuje funkcję zwrotną onArrival() i zatrzymuje wskazówki dojazdu zakręt po zakręcie. Aby przejść do następnego punktu orientacyjnego, musisz wyraźnie wywołać Navigator.continueToNextDestination(), a aby kontynuować nawigację krok po kroku, Navigator.startGuidance().

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

Aby uniknąć wycieku pamięci, musisz wywołać funkcję removeArrivalListener(listener), gdy nie będziesz już potrzebować odsłuchiwania.

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

Otrzymywanie aktualizacji lokalizacji

Uzyskaj RoadSnappedLocationProviderNavigationApi, a następnie zadzwoń pod numer RoadSnappedLocationProvider.addLocationListener(), aby zarejestrować się na połączenie zwrotne, gdy zmieni się lokalizacja lub kurs 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 SDK Nawigacji zapewnia aktualizacje lokalizacji tak często, jak to możliwe. Gdy dostępna jest aktualizacja lokalizacji, pakiet SDK nawigacji wywołuje funkcję zwrotną onLocationChanged().

Aktualizacje lokalizacji związane z drogą są niezależne od nawigacji i mogą być kontynuowane nawet po jej zatrzymaniu. Subskrybowanie aktualizacji lokalizacji może powodować szybsze zużycie baterii, wyciek pamięci lub niezamierzone gromadzenie danych o lokalizacji urządzenia, jeśli aktualizacje lokalizacji są włączone w tle. Zadzwoń do RoadSnappedLocationProvider.removeLocationListener, gdy nie będziesz już potrzebować 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);
}

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

Zadzwoń pod numer Navigator.addRemainingTimeOrDistanceChangedListener() , aby zarejestrować się na połączenie zwrotne, gdy pozostały czas (w sekundach) lub odległość (w metrach) zmieni się o więcej niż określony próg.

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

Aby sprawdzić pozostały czas i odległość, zadzwoń pod numer Navigator.getTimeAndDistanceList(). 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. Ten typ może być ciężki, średni, lekki lub nieznany. Odpowiada on kolorowi, który widzisz na eta w interfejsie map (ciężka = czerwony, średnia = żółty, lekka = zielony). Jest to przydatne, jeśli chcesz utworzyć własny nagłówek lub stopkę.

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

Przykład poniżej prosi o połączenie zwrotne, jeśli pozostały czas zmienia 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, używając 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 dotarcia do wielu punktów pośrednich możesz też wyświetlić, używając metody getTimeAndDistanceList().

otrzymywać powiadomienia o zmianach trasy;

Zadzwoń pod numer Navigator.addRouteChangedListener(), aby zarejestrować się na oddzwonienie, gdy trasa ulegnie zmianie.

Gdy trasa się zmieni, pakiet SDK nawigacji wywoła funkcję onRouteChanged(). Aby znaleźć nową trasę, możesz zadzwonić na numer Navigator.getRouteSegments lub Navigator.getCurrentRouteSegment().

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

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, gdy zmieni się tryb nocny.

Ten przykład pokazuje słuchanie zmian trybu nocnego w fragmentie 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ć programowo. Więcej informacji znajdziesz w artykule Ustawianie trybu nocnego.