Detectar eventos de navegação

Seu app pode detectar eventos que ocorrem quando o usuário navega por um trajeto.

Visão geral

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

Achou o código?

Detectar a chegada a um destino

Nesse caso, um destino se refere a um destino final ou a um waypoint. Para detectar a chegada, chame Navigator.addArrivalListener(), que se registra para um callback quando o dispositivo chega a um destino.

Ao chegar, o SDK Navigation para Android aciona o onArrival() callback, que pode ser usado para interromper a navegação guiada usando Navigator.stopGuidance() ou avançar para o próximo waypoint usando Navigator.continueToNextDestination(). Se a sessão de navegação incluir apenas um destino ou se não houver mais destinos na lista, chamar Navigator.continueToNextDestination() interrompe a orientação automaticamente.

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

Para evitar vazamentos de memória, chame removeArrivalListener(listener) quando não precisar 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

Receba um RoadSnappedLocationProvider da NavigationApi, e chame RoadSnappedLocationProvider.addLocationListener() para se registrar em um callback quando a localização ou a direção do dispositivo mudar. Observe que esta localização é ajustada a uma estrada e, portanto, pode ser diferente da localização retornada pelo provedor de localização combinada nas APIs de localização do Google Play Services.

O SDK Navigation fornece atualizações de localização com a maior frequência possível. Quando uma atualização do local está disponível, o SDK Navigation aciona o onLocationChanged() callback.

As atualizações de localização ajustadas à estrada são independentes da navegação e podem continuar mesmo depois que a navegação é interrompida. A inscrição em atualizações de localização pode causar consumo elevado da bateria, vazamento de memória ou coleta não intencional de dados de localização do dispositivo se você deixar as atualizações de localização em execução em segundo plano. Chame RoadSnappedLocationProvider.removeLocationListener quando não precisar 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

Chame Navigator.addRemainingTimeOrDistanceChangedListener() para se registrar em um callback quando o tempo restante (segundos) ou a distância (metros) mudar em mais de um limite determinado.

Quando a mudança no tempo ou na distância exceder o valor especificado, o SDK Navigation acionará o onRemainingTimeOrDistanceChanged() callback.

Para encontrar o tempo e a distância restantes, chame Navigator.getTimeAndDistanceList(). Note que os tempos e as distâncias na lista são cumulativos: eles mostram o tempo e a distância da localização atual até cada waypoint, não de um waypoint para outro. O objeto TimeAndDistance agora também retorna delaySeverity. Esse enum será pesado, médio, leve ou desconhecido. Isso corresponde à cor que aparece no HEC na interface do Maps (pesado = vermelho, médio = amarelo, leve = verde). Isso é útil se você precisar criar seu próprio rodapé de tempo estimado de chegada.

Para evitar vazamentos de memória, chame Navigator.removeRemainingTimeOrDistanceChangedListener(listener) quando não precisar mais do listener.

O exemplo abaixo solicita um callback se o tempo restante mudar em mais de 60 segundos ou a distância restante mudar 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 informações de tempo e distância restantes usando a tela integrada usando o setEtaCardEnabled() método e transmitindo um parâmetro com o valor TRUE. Para suprimir a exibição de tempo e distância, defina esse valor como FALSE.

Também é possível expor o tempo estimado de chegada para vários waypoints usando o getTimeAndDistanceList() método.

Receber atualizações de trajeto

Chame Navigator.addRouteChangedListener() para se registrar em um callback quando o trajeto mudar.

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

Para evitar vazamentos de memória, chame removeRouteChangedListener(listener) quando vo cê não precisar 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 muda

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

O exemplo a seguir mostra a detecção de mudanças no modo noturno em 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);
    }
});

Também é possível definir o modo noturno de forma programática. Para mais informações, consulte Definir o modo noturno.