Introdução
O SDK Navigation (Nav SDK) oferece um recurso de navegação guiada de alta qualidade que pode ser muito útil para clientes e motoristas, especialmente os novos ou que não conhecem a região. No entanto, há casos de uso específicos em que as empresas não querem tirar a atenção dos motoristas da estrada com a interface de navegação guiada, mas ainda querem rastrear a localização dos veículos e ouvir eventos relacionados ao trajeto. Um exemplo são os caminhoneiros, principalmente se estiverem transportando materiais perigosos. Outras empresas que fazem entregas usando diferentes modalidades, como caminhada para curtas distâncias, também podem não precisar de navegação guiada, o que economizaria a bateria do dispositivo.
Escopo
Este documento descreve como as empresas podem ocultar o mapa de navegação (visualização) do SDK Navigation e ainda aproveitar todos os recursos dele em relação ao rastreamento de localização, assinaturas de eventos e callbacks. Os dados capturados pelo SDK de navegação no modo sem tela podem ser usados para melhorar a capacidade de rastrear veículos e entender os ETAs com mais precisão, o que leva a mais transparência e eficiência.
SDK do Navigation
O SDK Navigation é uma biblioteca nativa do Android / iOS adicionada ao app para motoristas. No contexto da mobilidade, ele é responsável por:
- Obter locais ajustados à via do app que está executando. Os locais ajustados à via são mais precisos do que o FusedLocationProvider (FLP) do Android, porque usam a rede viária do Google para ajustar os locais ao segmento de via mais próximo, o que torna as ETAs e outras informações do FLP muito mais precisas.
- Experiência de navegação guiada que permite aos motoristas ir do ponto A ao ponto B de maneira eficiente, considerando o trânsito em tempo real e outras restrições de rota.
- Disparar eventos com base no progresso da rota, localização, velocidade etc. usando listeners de eventos e callbacks registrados.
Experiência padrão
Quando os clientes implementam o SDK Navigation, presume-se que eles precisam do recurso de navegação guiada. Por isso, a documentação do SDK de navegação (Android e iOS) oferece instruções sobre como implementar o SDK de navegação com a navegação guiada ativada.
No Android, a renderização do mapa de navegação guiada no app é feita usando um SupportNavigationFragment ou NavigationView. Já no iOS, é um GMSMapView. Esses elementos de interface adicionam o mapa interativo e a interface de navegação guiada ao seu app.
Na próxima seção, vamos comparar o SDK Navigation padrão com o código ativado de navegação guiada e o código do SDK Navigation sem interface para Android e iOS, destacando as mudanças necessárias.
Solução
Android
No Android, esse é o código Java que faz parte do app de exemplo do SDK Navigation.
@Override
@SuppressLint("MissingPermission")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Obtain a reference to the NavigationFragment
setContentView(R.layout.activity_nav_fragment);
mNavFragment = (SupportNavigationFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);
Como você pode ver, o ponto de vista aponta para o layout que deve ser usado para desenhar a experiência de navegação e, nesse caso, um SupportNavigationFragment é criado em vez do NavigationView.
Para fazer com que o SDK de navegação seja iniciado no modo sem interface gráfica, basta remover essas duas instruções. Se a ideia for alternar entre headless e não headless (navegação ativa), uma variável poderá ser usada para determinar se headless deve ou não ser usado. Por exemplo:
Boolean mHeadless = true;
Depois, ele pode ser usado assim:
@Override
@SuppressLint("MissingPermission")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Obtain a reference to the NavigationFragment
if(!mHeadless) {
setContentView(R.layout.activity_nav_fragment);
mNavFragment =
(SupportNavigationFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);
}
A variável mHeadless pode ser vinculada a um componente da interface (por exemplo, uma alternância) que vai ativar ou desativar o headless de acordo com a situação.
|
|
| SDK do Navigation em execução com navegação ativa (headless desativado) | Mesmo app, mas agora com o SDK Navigation sendo executado no modo headless |
Como você pode ver no exemplo à direita acima, a navegação do SDK Navigation está sendo executada nos bastidores, mas a experiência de navegação guiada está desativada.
iOS
No iOS, o modo sem tela pode ser feito com muita facilidade adicionando a seguinte configuração durante a inicialização do MapView: \
mapView.isHidden = true
Por exemplo:
/// The main map view.
private lazy var mapView: GMSMapView = {
let mapView = GMSMapView(frame: .zero)
mapView.isHidden = true /// Make it headless!
mapView.isNavigationEnabled = true
mapView.settings.compassButton = true
mapView.delegate = self
return mapView
}()
Veja como ficaria. A tela vai depender da forma como a interface é implementada, e a captura de tela é apenas para ilustrar o efeito de ocultar o mapView:
|
|
| Navegação ativa em execução em
App de exemplo para iOS |
Mesmo app no modo headless |
Considerações sobre a implementação
Como o modo sem tela nada mais é do que ocultar o mapa de navegação da tela, apenas o tempo de tela é salvo, o que aumenta a duração da bateria no dispositivo. No entanto, como o SDK de navegação vai continuar sendo executado, as atualizações de local e todos os callbacks de eventos serão acionados normalmente. Portanto, não há efeito colateral ao usar essa configuração.
Conclusão
Este documento mostra a flexibilidade do SDK de navegação e o que podemos alcançar em diferentes sistemas operacionais, considerando as restrições deles. Ele também permite que os clientes personalizem a experiência de direção para evitar distrações e melhorar a segurança.
Outros recursos
Se as notificações precisarem ser desativadas durante a navegação pelos motivos mencionados acima, isso também pode ser feito. Consulte Modificar notificações passo a passo no SDK de navegação.