SDK de navegação: modo headless

Introdução

O SDK Navigation (Nav SDK) oferece um recurso de navegação curva a curva de alta qualidade que pode ser muito útil para clientes e motoristas, especialmente os novos ou aqueles 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 curva a curva, mas ainda querem rastrear a localização dos veículos e ouvir eventos relacionados ao trajeto que eles estão seguindo. 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 instruções detalhadas, 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 do SDK de navegação no modo sem interface gráfica podem ser usados para melhorar a capacidade de rastrear veículos e entender os ETAs com mais precisão, o que leva à transparência e à eficiência.

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 estimativas de chegada e outras informações do FLP muito mais precisas.
  • Experiência de navegação curva a curva que permite aos motoristas ir do ponto A ao ponto B de forma 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 de navegação, presume-se que eles precisam do recurso de navegação curva a curva. 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 o recurso de navegação ponto a ponto ativado.

No Android, a renderização do mapa guiado 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 curva a curva 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 criar a experiência de navegação e, nesse caso, um SupportNavigationFragment é criado em vez da NavigationView.

Para fazer com que o SDK Navigation comece no modo sem interface, 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 modo sem tela de acordo com a situação.

alt_text alt_text
SDK do Navigation em execução com navegação ativa (headless desativado) Mesmo app, mas agora com o SDK de navegação em execução no modo headless

Como você pode ver no exemplo à direita acima, a navegação do SDK Nav está sendo executada nos bastidores, mas a experiência de navegação curva a curva 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 depende da forma como a interface é implementada, e a captura de tela é apenas para ilustrar o efeito de ocultar o mapView:

alt_text alt_text
Navegação ativa em execução em

Exemplo de app 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 Navigation 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 de navegação guiada por voz no SDK Navigation.