Detectar eventos de navegação

Seu app pode detectar eventos que ocorrem enquanto o usuário navega ao longo de um trajeto.

Visão geral

Use as seguintes interfaces para detectar eventos de navegação:

Achou o código?

Detectar chegada a um destino

Aqui, um destino se refere a um destino final ou a um waypoint. Para detectar chegada, chamar Navigator.addArrivalListener(), que é registrado para um callback quando o dispositivo chega a um destino.

Na chegada, o SDK do Navigation para Android é acionado o callback onArrival() e interrompe a orientação guiada. É necessário chamar explicitamente Navigator.continueToNextDestination() para avançar até o próximo ponto de referência e Navigator.startGuidance() para continuar a navegação guiada.

Quando você chama continueToNextDestination(), o navegador descarta todos informações sobre o destino anterior. Se você quiser analisar informações sobre o trecho de trajeto anterior, recupere as informações no navegador antes de chamar continueToNextDestination().

Para evitar vazamentos de memória, chame removeArrivalListener(listener) quando você não não precisam mais do 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();
        }
    }
});

Receber atualizações de localização

Consiga um RoadSnappedLocationProvider do NavigationApi, depois ligue RoadSnappedLocationProvider.addLocationListener() para se registrar para um callback quando a localização ou a direção do dispositivo mudar. Observe que este local está vinculado a uma estrada e, portanto, pode ser diferente de a localização retornada pelo provedor de localização combinada no Google Play APIs de localização de serviços.

O SDK do Navigation fornece atualizações de localização sempre que sempre que possível. Quando uma atualização de local está disponível, o O SDK do Navigation aciona o Callback onLocationChanged().

As atualizações de localização na via são independentes da navegação e podem continuar mesmo depois que a navegação parar. A inscrição para receber atualizações de localização pode causar consumo elevado da bateria, vazamento de memória ou coleta não intencional da localização do dispositivo se deixar as atualizações de local em execução em segundo plano. Ligação RoadSnappedLocationProvider.removeLocationListener quando não precisa mais do listener.

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

Receber atualizações de tempo e distância

Chamar Navigator.addRemainingTimeOrDistanceChangedListener() registrar-se para um callback quando o tempo restante (segundos) ou a distância (em metros) muda em mais do que um determinado limite.

Quando a mudança no tempo ou na distância exceder o valor especificado, o O SDK do Navigation aciona o onRemainingTimeOrDistanceChanged() o retorno de chamada.

Para encontrar o tempo e a distância restantes, chame Navigator.getTimeAndDistanceList() Observe que o os tempos e as distâncias na lista são cumulativos: mostram o tempo e a distância a partir da localização atual até cada ponto de referência, e não de um ponto para outro. O objeto TimeAndDistance agora também retorna delaySeverity. Esse tipo enumerado ser pesado, médio, leve ou desconhecido. Isso corresponde à cor que você ver no eta na interface do usuário do Google Maps (pesado = vermelho, médio = amarelo, luz = verde). Isso é útil se você precisar criar seu próprio rodapé ETA.

Para evitar vazamentos de memória, você precisa chamar Navigator.removeRemainingTimeOrDistanceChangedListener(listener) quando não precisa mais do listener.

O exemplo abaixo solicita um retorno de chamada se o tempo restante for alterado em mais de 60 segundos ou a distância restante muda em mais de 100 metros.

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

Você pode mostrar as informações restantes de tempo e distância usando o exibir usando o método setEtaCardEnabled(). e passando um parâmetro com o valor TRUE. Para suprimir o tempo/distância de exibição, defina esse valor como FALSE.

Você também pode expor o HEC de vários waypoints usando o método getTimeAndDistanceList().

Receber atualizações de trajeto

Chame Navigator.addRouteChangedListener() para registrar-se para um retorno de chamada quando a rota mudar.

Quando o trajeto muda, o SDK do Navigation aciona o Callback onRouteChanged(). Você pode ligar Navigator.getRouteSegments e Navigator.getCurrentRouteSegment() para encontrar o novo trajeto.

Para evitar vazamentos de memória, chame removeRouteChangedListener(listener) quando você não não precisam mais do 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);
    }
});

Detectar quando o modo noturno é alterado

Chame NavigationView.addOnNightModeChangedListener ou SupportNavigationFragment.addOnNightModeChangedListener para se registrar para receber um callback quando o modo noturno mudar.

O exemplo a seguir mostra a detecção de mudanças no modo noturno em um um fragmento de navegação.

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