Criar apps do Android Automotive OS para carros estacionados

Além de oferecer suporte a apps criados para você usar quando está dirigindo, o Android Automotive OS também oferece suporte a apps de navegadores, jogos e vídeos para quando o veículo está estacionado. É possível enviar o mesmo app, tanto para carros como para dispositivos de tela grande, fazendo apenas algumas pequenas mudanças.

Testar o app em um emulador do Android Automotive OS

Para começar a criar apps para Android Automotive OS, primeiro teste seu app em um emulador do Android Automotive OS. Siga as etapas em Testar usando o emulador do Android Automotive OS e configure o emulador. Em seguida, execute o app seguindo as instruções em Executar o app no emulador.

Ao executar o app, tenha cuidado com problemas de compatibilidade, como estes:

  • As telas de infoentretenimento têm orientações fixas. Para atender às diretrizes de qualidade de apps para carros, os apps precisam oferecer suporte às orientações de retrato e paisagem.
  • As APIs disponíveis em outros dispositivos podem não estar presentes no Android Automotive OS. Esse é o caso de algumas APIs do Google Play Services, por exemplo. Consulte a seção Desativar recursos para conferir mais detalhes sobre como lidar com esses problemas.

Configurar os arquivos de manifesto do app

Para ser direcionado ao Android Automotive OS, o app precisa ter determinadas entradas de manifesto. Com elas, os apps destinados ao Android Automotive OS são enviados à Play Store usando outro tipo de versão do Automotive OS. Eles passam por um processo de análise manual para garantir que sejam seguros para uso em carros. Confira mais detalhes em Distribuir apps Android para carros.

Recursos necessários do Android Automotive OS

Para serem listados na Play Store em um carro, os apps criados para o Android Automotive OS precisam incluir o seguinte elemento <uses-feature> no arquivo AndroidManifest.xml:

<manifest ...>
    ...
    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />
    ...
</manifest>

Os apps enviados para faixas não automotivas não podem declarar o elemento <uses-feature> mostrado no exemplo de código anterior, porque não dependem de hardware específico para carros. Portanto, para enviar o mesmo app para dispositivos automotivos e não automotivos, é necessário gerar pelo menos duas variações: uma para dispositivos automotivos e outra para dispositivos móveis. Para mais informações sobre como criar essas variações, consulte estas páginas:

As duas variações do app podem ter o mesmo nome de pacote, mas precisam ter códigos de versão diferentes, já que elas são enviadas separadamente para as faixas da Play Store.

Como alternativa, em vez de usar variações separadas, você pode usar nomes de pacotes diferentes para os APKs de dispositivos móveis e automotivos ou pacotes de app. Se quiser entender as desvantagens de cada abordagem, consulte a seção Nomes de pacote no guia para desenvolvedores de apps de mídia.

Além dos elementos mostrados no exemplo de código anterior, os apps criados para o Android Automotive OS precisam incluir estes elementos <uses-feature> no elemento raiz <manifest>:

<uses-feature
  android:name="android.hardware.wifi"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.portrait"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.landscape"
  android:required="false"/>

Definir explicitamente esses recursos como não obrigatórios garante que o app não entre em conflito com os recursos de hardware disponíveis nos dispositivos Android Automotive OS.

Verificar se não há atividades otimizadas contra distrações

Para garantir que seu app esteja disponível para uso apenas estacionado, não inclua o seguinte elemento <meta-data> em nenhum elemento <activity> do manifesto:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Sem esses metadados, as atividades do app são bloqueadas automaticamente pelo SO quando o veículo está em movimento a fim de reduzir as distrações para o motorista. Isso acontece como um callback do ciclo de vida de onPause, em que você precisa pausar a reprodução de vídeo e áudio do app.

Otimizar o app para o Android Automotive OS

Para oferecer aos usuários a melhor experiência possível, não se esqueça do seguinte ao criar seu app para o Android Automotive OS.

Otimizar para telas grandes

As telas presentes nos veículos com Android Automotive OS são mais semelhantes em tamanho, resolução e proporção a tablets e dispositivos dobráveis do que a smartphones. Dessa forma, otimizar o app para telas grandes também beneficia os usuários de carros.

Consulte especificamente os guias Suporte a tamanhos de tela diferentes e Migrar a interface para layouts responsivos. Neles, você vai encontrar detalhes sobre como aproveitar ao máximo telas grandes, além das galerias de mídia e jogos para inspiração de design e orientação.

Outras otimizações de tela grande, como compatibilidade de entrada, não são diretamente benéficas para o Android Automotive OS, mas ainda podem melhorar a experiência do usuário. Por exemplo, a navegação pelo teclado usa as mesmas APIs da navegação por seletor giratório, então qualquer otimização feita nela pode beneficiar os dois formatos.

Trabalhar com encartes de janela e cortes de tela

Assim como em outros formatos, o Android Automotive OS inclui elementos da interface do sistema, como barras de status e navegação, e suporte a telas não retangulares.

Por padrão, os apps desenham em uma área que não se sobrepõe às barras do sistema ou aos cortes da tela. No entanto, você pode querer que o app oculte as barras do sistema, desenhe o conteúdo atrás delas ou mostre o conteúdo em um recorte da tela, conforme descrito em Posicionar o app dentro de encartes de janela. Se o app realizar qualquer uma dessas ações, consulte as subseções a seguir para ver detalhes sobre como permitir que o app funcione bem em todo o ecossistema de dispositivos Android Automotive OS.

Barras de sistema, modo imersivo e renderização de borda a borda

As barras do sistema em carros podem ser dimensionadas e posicionadas de maneira diferente de outros formatos. Por exemplo, as barras de navegação podem ser posicionadas à esquerda, à direita ou na parte de baixo da tela. Mesmo que haja uma barra de status na parte de cima e uma barra de navegação na parte de baixo, como é o caso da maioria dos smartphones e tablets, o tamanho desses elementos provavelmente será muito maior em carros.

Além disso, o Android Automotive OS permite que os OEMs controlem se os apps podem ou não mostrar ou ocultar as barras do sistema para entrar e sair do modo Imersivo. Por exemplo, ao impedir que apps ocultem as barras do sistema, os OEMs podem garantir que os controles do veículo, como os controles de clima, estejam sempre acessíveis na tela. Se um OEM impedir os apps de controlar as barras do sistema, nada acontecerá quando um app chamar as APIs WindowInsetsController (ou WindowInsetsControllerCompat) para mostrar ou ocultar barras do sistema. Consulte a documentação de show e hide para saber mais sobre como detectar se o app conseguiu modificar os encartes.

Da mesma forma, os OEMs também podem controlar se os apps podem ou não definir a cor e a transparência das barras do sistema para garantir que elas e os elementos contidos nelas fiquem claramente visíveis o tempo todo. Se o app desenhar de ponta a ponta, confira se apenas conteúdo não essencial é mostrado por trás das barras do sistema. Esse conteúdo pode não ser visível se o OEM do dispositivo impedir a configuração da cor ou da translucidez das barras.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Se o app for de ponta a ponta, não faça suposições sobre o tamanho, o número, o tipo ou a localização das barras do sistema. Em vez disso, use as APIs de encartes de janela para mostrar o conteúdo do app em relação às barras do sistema. Consulte Exibir conteúdo de ponta a ponta no app para saber mais sobre como usar essas APIs. Valores de padding codificados que, embora nunca sejam recomendados, podem manter o conteúdo na área segura em outros dispositivos que provavelmente não serão usados em carros.

Adaptar-se a telas de formato irregular

Além das telas retangulares, alguns veículos podem ter telas de formato irregular, como mostrado na Figura 1:

Um diagrama de um dispositivo Android Automotive OS com uma tela
      curvada no lado direito.
Figura 1: um dispositivo Android Automotive OS com a tela curvada no lado direito. A área verde é o retângulo seguro que não se sobrepõe à caixa delimitadora do corte da tela da curva.

Se o app não renderizar de ponta a ponta, não será necessário fazer nada para que ele seja renderizado dentro da área segura.

Se o app renderizar de ponta a ponta, você poderá escolher como gostaria que ele se comporte em relação aos cortes da tela. Para fazer isso, use recursos definindo o atributo android:windowLayoutInDisplayCutoutMode para o tema do app ou durante a execução modificando o atributo layoutInDisplayCutoutMode da janela.

Como os tipos de corte da tela presentes nos dispositivos Android Automotive OS são diferentes daqueles encontrados em dispositivos móveis, não use LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT ou LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, que têm comportamento otimizado para os cortes encontrados em dispositivos móveis. Em vez disso, use LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER ou LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS para sempre evitar ou sempre inserir o corte. Ao escolher a segunda opção, consulte Suporte a cortes de tela para mais detalhes sobre as APIs relacionadas a cortes de tela.

Se o app for renderizado na área de corte da tela e você quiser ter um comportamento diferente entre o Android Automotive OS e o dispositivo móvel, consulte Desativar recursos para orientações caso o app defina esse comportamento no momento da execução e Usar recursos alternativos se o app definir esse comportamento usando arquivos de recurso.

Desativar recursos

Se você estiver disponibilizando um app para dispositivos móveis no Android Automotive OS, alguns recursos e funcionalidades podem não ser relevantes ou não estar disponíveis. Por exemplo, os carros geralmente não oferecem acesso a câmeras. Além disso, apenas um subconjunto do Google Play Services está disponível no Android Automotive OS. Consulte mais detalhes em Google Play Services para carros.

Você pode usar a API PackageManager.hasSystemFeature para detectar se o app está sendo executado no Android Automotive OS. Para isso, confira se o recurso FEATURE_AUTOMOTIVE está presente, conforme mostrado no exemplo a seguir:

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Como alternativa, se o app também tiver um componente do Android Auto, você poderá usar a API CarConnection da biblioteca Android for Cars App para detectar se o app está sendo executado no Android Automotive OS ou no Android Auto ou se não está conectado a um carro.

No modo picture-in-picture (PiP), siga as práticas recomendadas estabelecidas para conferir se o recurso está disponível e reagir de forma adequada.

Lidar com cenários off-line

Embora os carros estejam cada vez mais conectados à Internet, é recomendado que os apps possam ser executados sem uma conexão de Internet, como nos seguintes casos:

  • Os usuários podem desativar os dados móveis oferecidos como parte de um pacote de assinatura do fabricante de automóveis.
  • O acesso a dados móveis pode ser limitado em algumas áreas.
  • Carros com rádios Wi-Fi podem estar fora do alcance do recurso ou um OEM pode desativar o Wi-Fi em favor de uma rede móvel.

Prepare-se para lidar com esses cenários no seu app fazendo uma degradação suave das funcionalidades que dependem do acesso à Internet, como a oferta de conteúdo off-line. Se quiser mais informações, consulte as práticas recomendadas para otimizar redes.

Usar recursos alternativos

Para adaptar seu app para carros, use o qualificador de recurso car, que fornece recursos alternativos durante a execução de um app em um veículo com o Android Automotive OS. Por exemplo, se você utilizar recursos de dimensão para armazenar valores de padding, poderá usar um valor maior para o conjunto de recursos car para aumentar as áreas de toque.

Distribuir seu app

Depois de testar seu app em relação às diretrizes de qualidade de apps para carros da categoria e criar um build do Android Automotive OS com as mudanças necessárias, você pode publicar o item nas faixas de formato do Automotive OS na Play Store. Consulte Distribuir apps Android para carros para mais detalhes sobre o processo de publicação.

Enviar feedback sobre apps para carros estacionados

Use o Google Issue Tracker se tiver problemas ou quiser sugerir um recurso durante o desenvolvimento do seu app para carros estacionados para Android Automotive OS. Preencha todas as informações solicitadas no modelo de problema. Antes de informar um novo problema, verifique se ele já foi comunicado na lista. É possível se inscrever e votar em problemas clicando na estrela ao lado deles. Para ver mais informações, consulte Como se inscrever em um problema.

Criar novo problema