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 SDK do nawigacji na Androida wywołuje funkcję onArrival() i zatrzymuje wskazówki dojazdu. 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, przed wywołaniem funkcji continueToNextDestination() musisz pobrać informacje z nawigatora.

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

otrzymywać aktualizacje dotyczące 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łączony dostawca lokalizacji w interfejsach API lokalizacji Usług Google Play.

Pakiet SDK do nawigacji przekazuje aktualizacje lokalizacji tak często, jak to możliwe. Gdy jest dostępna aktualizacja lokalizacji, pakiet SDK nawigacji wywołuje funkcję onLocationChanged().

Aktualizacje lokalizacji na podstawie danych z mapy 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 zbieranie danych o lokalizacji urządzenia, jeśli pozostawisz aktualizacje lokalizacji działające w tle. Zadzwoń do 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);
}

otrzymywać aktualizacje dotyczące czasu 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ść, Navigation SDK wywoła funkcję zwrotną 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 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 w etapie w interfejsie Map (intensywny = czerwony, średni = żółty, jasny = zielony). Jest to przydatne, jeśli chcesz utworzyć własny nagłówek lub stopkę.

Aby uniknąć wycieku pamięci, musisz wywołać funkcję Navigator.removeRemainingTimeOrDistanceChangedListener(listener), gdy nie potrzebujesz już listenera.

Przykład poniżej prosi o powrót do dzwoniącego, 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().

otrzymywać informacje o trasie,

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

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

Poniższy przykład pokazuje sprawdzanie zmian w trybie nocnym w 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.