Um feed de dados de navegação guiada fornece informações de navegação para dispositivos que não foram projetados para orientação de navegação baseada em mapas. Ele fornece as próximas manobras com elementos que você fornece:
- Ícones (esquerda, direita, retorno)
- números de conversão em rotatórias
- nomes de vias
- distâncias e tempos estimados até a próxima etapa do trajeto ou o destino final;
Use o feed de navegação guiada para criar experiências em que a interface completa do SDK de navegação não é adequada, como no Android Auto ou em telas pequenas em que uma pilha completa do Android não está disponível. Por exemplo, você pode usar isso para motoristas de veículos de duas rodas, em que é possível projetar orientações somente de navegação para ajudá-los a chegar aos destinos com mais rapidez e confiança, com o mínimo de distrações.
Para usar o SDK, crie um serviço e registre-o no SDK do Navigation para Android para que ele possa receber novas informações de navegação em tempo real (cerca de uma vez por segundo durante a navegação).
Neste documento, mostramos como criar e registrar um serviço de navegação que recebe informações de navegação do SDK e fornece o estado de navegação ao dispositivo receptor.
Visão geral
Nesta seção, resumimos o fluxo geral para ativar o recurso de navegação guiada.
Como usar o recurso TurnByTurn
Confira as etapas gerais para ativar o recurso de navegação guiada. As seções a seguir fornecem detalhes sobre cada etapa.
Criar um serviço para receber atualizações de navegação
O SDK do Navigation se vincula ao serviço TurnByTurn e envia atualizações de navegação pelo Android Messenger. Você pode criar um novo serviço de navegação para essas atualizações ou usar um serviço atual.
O benefício de usar um serviço para receber atualizações de navegação é que ele pode residir em um processo em segundo plano separado.
O serviço no exemplo a seguir recebe informações de navegação e usa
o TurnByTurnManager para converter os dados em um objeto NavInfo que
contém os detalhes de navegação.
/** * Receives turn-by-turn navigation information forwarded from NavSDK. */ public class NavInfoReceivingService extends Service { /** The messenger used by the service to receive nav step updates. */ private Messenger incomingMessenger; private TurnByTurnManager turnByTurnManager; private final class IncomingNavStepHandler extends Handler { public IncomingNavStepHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { // Identify the message through the msg.what field. if (TurnByTurnManager.MSG_NAV_INFO == msg.what) { // Extract the NavInfo object using the TurnByTurnManager. NavInfo navInfo = turnByTurnManager .readNavInfoFromBundle(msg.getData())); // Do something with the NavInfo } } } @Nullable @Override public IBinder onBind(Intent intent) { return incomingMessenger.getBinder(); } @Override public void onCreate() { turnByTurnManager = TurnByTurnManager.createInstance(); HandlerThread thread = new HandlerThread("NavInfoReceivingService", Process.THREAD_PRIORITY_DEFAULT); thread.start(); incomingMessenger = new Messenger( new IncomingNavStepHandler(thread.getLooper())); }
Códigos de mensagem
As mensagens NavInfo podem ser identificadas pelo campo
Message.what
da classe Message, que é definido como o valor de
TurnByTurnManager.MSG_NAV_INFO.
Como registrar o serviço para atualizações de navegação
Os snippets de código a seguir registram o serviço de navegação.
boolean isNavInfoReceivingServiceRegistered = navigator.registerServiceForNavUpdates( getPackageName(), NavInfoReceivingService.class.getName(), numNextStepsToPreview);
Como iniciar e interromper o serviço
O serviço de navegação fica ativo enquanto o SDK do Navigation está vinculado a ele. É possível chamar manualmente
startService() e stopService() para controlar o ciclo de vida do serviço de navegação, mas, quando você registra seu serviço no
SDK do Navigation, ele é iniciado automaticamente e
só para quando você cancela o registro. Dependendo de como você configurou o app, talvez
seja interessante iniciar um serviço em primeiro plano, descrito na
Visão geral de serviços
da documentação do Android.
Como cancelar o registro do serviço
Para parar de receber atualizações de navegação, cancele o registro do serviço no SDK do Navigation.
navigator.unregisterServiceForNavUpdates();
Entender os estados de navegação
Use NavInfo.getNavState() para ver o estado atual da navegação, que é um dos seguintes:
Enroute: o estado
ENROUTEsignifica que a navegação guiada está ativa e o usuário está no trajeto fornecido. As informações sobre a próxima etapa de manobra estão disponíveis.Rerouting:
REROUTINGsignifica que a navegação está em andamento, mas o navegador está procurando um novo trajeto. A próxima etapa de manobra não está disponível porque ainda não há uma nova rota. No app de exemplo, uma mensagem "Traçando novo trajeto…" aparece na tela de informações de navegação. Quando um trajeto é encontrado, uma mensagemNavInfoé enviada com o estadoENROUTE.Stopped:
STOPPEDsignifica que a navegação foi encerrada. Por exemplo, a navegação é interrompida quando o usuário sai da navegação no app. No app de exemplo, um estadoSTOPPEDlimpa a exibição de informações de navegação para evitar que instruções de etapas persistentes sejam mostradas.
Preencher a exibição do feed
Agora que você configurou o serviço de navegação guiada, esta seção aborda os elementos visuais e elementos do texto que podem ser usados para preencher os cards de orientação do feed de navegação guiada.
Campos de informações do card de navegação
Quando o usuário entra na navegação guiada, um card de navegação aparece na parte de cima, contendo dados de navegação preenchidos pelo SDK de navegação. A imagem relacionada mostra um exemplo desses elementos de navegação essenciais.
Esta tabela mostra os campos de informações de navegação e onde encontrá-los.
| Campos para cada etapa de navegação | Campos para a viagem geral |
|---|---|
Encontrado em StepInfo |
Encontrado em NavInfo |
| Nome completo da via | Tempo restante |
| Ícone de manobra | Distância até o destino |
| Distância até a próxima etapa | |
| Campos de indicação de faixa |
Indicação de faixa
O SDK de navegação representa as faixas no card de navegação
como objetos de dados
Lane
e
LaneDirection. Um objeto Lane representa uma faixa específica durante a navegação e
tem uma lista de objetos LaneDirection que descrevem todas as conversões que podem ser
feitas nessa faixa.
A direção recomendada para um usuário em uma faixa é marcada pelo campo isRecommended.
Exemplo de indicação de faixa
O snippet a seguir ilustra a representação de dados das faixas mostradas acima.
// Lane 1
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false},
{/*laneShape=*/ SLIGHT_LEFT, /*isRecommended=*/ true}]
// Lane 2
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false}]
Criar ícones para manobras
O tipo enumerado
Maneuver
define cada manobra possível que pode ocorrer durante a navegação, e você
pode acessar a manobra de uma determinada etapa usando o método StepInfo.getManeuver().
Você precisa criar ícones de manobra e associá-los às manobras correspondentes.
Para algumas manobras, é possível configurar um mapeamento individual para um ícone, como
DESTINATION_LEFT e DESTINATION_RIGHT. No entanto, como algumas manobras são semelhantes, talvez você queira mapear mais de uma manobra para um único ícone. Por exemplo, TURN_LEFT e ON_RAMP_LEFT podem ser mapeados para o ícone de virar à esquerda.
Algumas manobras contêm um rótulo clockwise ou counterclockwise adicional,
que o SDK determina com base no lado de direção de um país. Por exemplo, em países onde se dirige do lado esquerdo da via, os motoristas fazem uma rotatória ou retorno no sentido horário, enquanto os países que dirigem do lado direito da via fazem no sentido anti-horário. O SDK do Navigation detecta
se uma manobra ocorre no trânsito à esquerda ou à direita e gera a
manobra apropriada. Portanto, o ícone de manobra pode ser diferente para uma manobra no sentido horário e outra no sentido anti-horário.
Abra para ver exemplos de ícones para diferentes manobras
| Ícone de amostra | Manobras de navegação guiada |
|---|---|
![]() |
DEPARTUNKNOWN |
![]() |
STRAIGHTON_RAMP_UNSPECIFIEDOFF_RAMP_UNSPECIFIEDNAME_CHANGE
|
![]() |
TURN_RIGHTON_RAMP_RIGHT
|
![]() |
TURN_LEFTON_RAMP_LEFT
|
![]() |
TURN_SLIGHT_RIGHTON_RAMP_SLIGHT_RIGHTOFF_RAMP_SLIGHT_RIGHT
|
![]() |
TURN_SLIGHT_LEFTON_RAMP_SLIGHT_LEFTOFF_RAMP_SLIGHT_LEFT
|
![]() |
TURN_SHARP_RIGHTON_RAMP_SHARP_RIGHTOFF_RAMP_SHARP_RIGHT
|
![]() |
TURN_SHARP_LEFTON_RAMP_SHARP_LEFTOFF_RAMP_SHARP_LEFT
|
![]() |
TURN_U_TURN_COUNTERCLOCKWISEON_RAMP_U_TURN_COUNTERCLOCKWISEOFF_RAMP_U_TURN_COUNTERCLOCKWISE
|
![]() |
TURN_U_TURN_CLOCKWISEON_RAMP_U_TURN_CLOCKWISEOFF_RAMP_U_TURN_CLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_RIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_STRAIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
|
![]() |
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_LEFT_CLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
|
![]() |
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_U_TURN_CLOCKWISE
|
![]() |
ROUNDABOUT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_CLOCKWISE
|
![]() |
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_EXIT_CLOCKWISE
|
![]() |
MERGE_RIGHTOFF_RAMP_RIGHT
|
![]() |
MERGE_LEFTOFF_RAMP_LEFT
|
![]() |
FORK_RIGHTTURN_KEEP_RIGHTON_RAMP_KEEP_RIGHTOFF_RAMP_KEEP_RIGHT
|
![]() |
FORK_LEFTTURN_KEEP_LEFTON_RAMP_KEEP_LEFTOFF_RAMP_KEEP_LEFT
|
![]() |
MERGE_UNSPECIFIED
|
![]() |
DESTINATION
|
![]() |
DESTINATION_RIGHT
|
![]() |
DESTINATION_LEFT
|
![]() |
FERRY_BOAT
|
![]() |
FERRY_TRAIN
|
Usar ícones gerados
Para facilitar os casos de uso do Android Auto, o SDK do Navigation é compatível com a geração de ícones de orientação de manobra e faixa. Esses ícones se encaixam nas orientações de dimensionamento de imagem da biblioteca de apps Car App do Android Auto, que recomenda uma caixa delimitadora de 500 x 74 dp. Consulte setsLaneImage e CarIcon na documentação de referência do Android para mais detalhes.
Exemplo de geração de ícones
NavigationUpdatesOptions options =
NavigationUpdatesOptions.builder()
.setNumNextStepsToPreview(numNextStepsToPreview)
.setGeneratedStepImagesType(GeneratedStepImagesType.BITMAP)
.setDisplayMetrics(getResources().getDisplayMetrics())
.build();
boolean isRegistered =
navigator.registerServiceForNavUpdates(
getPackageName(),
NavInfoReceivingService.class.getName(),
options);
Depois que você ativa a geração de ícones, o objeto TurnbyTurn StepInfo preenche os campos maneuverBitmap e lanesBitmap com os ícones.
A seguir
- Para apps do Android Auto:







































