Eventos de navegação

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

Visão geral

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

Confira o código

Detectar a chegada a um destino

Chame Navigator.setArrivalListener() para se registrar para um callback quando o dispositivo chegar a um destino, que pode ser um waypoint ou o destino final.

Ao chegar a um destino, o SDK do Navigation dispara o callback onArrival() e interrompe a orientação guiada. É necessário chamar explicitamente Navigator.continueToNextDestination() para avançar para o próximo waypoint e Navigator.startGuidance() para continuar a navegação guiada.

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

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

mNavigator.setArrivalListener(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

Extraia um RoadSnappedLocationProvider do NavigationApi e chame RoadSnappedLocationProvider.requestLocationUpdates() para se registrar em um callback quando a localização ou a direção do dispositivo mudarem. Essa localização é ajustada a uma via e, por isso, pode ser diferente da localização retornada pelo provedor de localização combinada nas APIs Location do Google Play Services.

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

As atualizações de local com ajustes nas vias são independentes da navegação e podem continuar mesmo depois que a navegação for interrompida. Se você deixar as atualizações de local em segundo plano, se deixar as atualizações de localização em segundo plano, se você deixar as atualizações de localização em segundo plano, isso poderá proporcionar consumo de bateria, vazamento de memória ou coleta não intencional de dados de local do dispositivo. Chame RoadSnappedLocationProvider.stopRequestingLocationUpdates() quando não precisar mais do listener.

mRoadSnappedLocationProvider =
        NavigationApi.getRoadSnappedLocationProvider(getApplication());
if (mRoadSnappedLocationProvider != null) {
    mRoadSnappedLocationProvider.requestLocationUpdates(
            new RoadSnappedLocationProvider.LocationListener() {
                @Override
                public void onLocationChanged(LocationEvent locationEvent) {
                    displayMessage("onLocationUpdated: Navigation engine has provided a new"
                                    + " road-snapped location: "
                                    + locationEvent.getLocation().toString(),
                            DISPLAY_LOG);
                }
            });
} else {
    displayMessage("ERROR: Failed to get a location provider", DISPLAY_LOG);
}

Receber atualizações de horário e distância

Chame Navigator.setRemainingTimeOrDistanceChangedListener() para registrar um callback quando o tempo restante (segundos) ou a distância (metros) mudarem mais que um determinado limite.

Quando a mudança no tempo ou na distância excede o valor especificado, o SDK do Navigation dispara o callback onRemainingTimeOrDistanceChanged().

Para encontrar o tempo e a distância restantes, chame Navigator.getTimeAndDistanceList(). Os tempos e distâncias na lista são cumulativos: eles mostram o tempo e a distância entre o local atual e cada waypoint, não de um waypoint 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ê vê no ETA na interface do Maps (pesada = vermelho, média = amarelo, clara = verde). Isso é útil se você precisar criar seu próprio rodapé de ETA.

Para evitar vazamentos de memória, chame Navigator.clearRemainingTimeOrDistanceChangedListener() 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.setRemainingTimeOrDistanceChangedListener(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 a tela integrada usando o método setEtaCardEnabled() e transmitindo um parâmetro com o valor TRUE. Para suprimir a exibição de tempo/distância, defina esse valor como FALSE.

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

Receber atualizações de rotas

Chame Navigator.setRouteChangedListener() para se registrar em um callback quando a rota mudar.

Quando a rota muda, o SDK do Navigation dispara o callback onRouteChanged(). Chame Navigator.getRouteSegments e Navigator.getCurrentRouteSegment() para encontrar a nova rota.

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

mNavigator.setRouteChangedListener(new Navigator.RouteChangedListener() {
    @Override
    public void onRouteChanged() {
        displayMessage("onRouteChanged: The driver's route has changed. Current waypoint: "
                + mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_LOG);
    }
});

Detectar mudanças no modo noturno

Chame NavigationFragment.setOnNightModeChangedListener, NavigationView.setOnNightModeChangedListener ou SupportNavigationFragment.setOnNightModeChangedListener para registrar um callback quando o modo noturno mudar.

O exemplo abaixo mostra a detecção de mudanças do modo noturno em um NavigationFragment.

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

Próxima etapa

Caso seu contrato com o Google especifique o faturamento por transação, configure as transações faturáveis. Descubra como personalizar a interface de navegação do usuário.