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.

Entradas de manifesto específicas para a categoria

Além dos requisitos anteriores, que se aplicam a todos os apps para carros estacionados, os as categorias de vídeo e jogos têm requisitos adicionais:

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 da 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 renderizam em uma área que não se sobrepõe às barras de sistema ou aos cortes da tela. No entanto, o app pode ocultar as barras de sistema, renderizar o conteúdo atrás delas ou mostrar o conteúdo em um corte da tela, conforme descrito em Posicionar o app dentro de encartes de janelas. Se o app realizar qualquer uma dessas ações, consulte as subseções abaixo para 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 ponta a ponta

As barras de 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 de sistema para entrar e sair do modo imersivo. Por exemplo, ao impedir que apps ocultem as barras de sistema, os OEMs podem garantir que os controles do veículo, como os de clima, fiquem sempre acessíveis na tela. Se um OEM impedir os apps de controlar as barras de sistema, nada acontecerá quando um app chamar as APIs WindowInsetsController (ou WindowInsetsControllerCompat) para mostrar ou ocultar barras de 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 translucência das barras de sistema para garantir que elas e os elementos contidos nelas fiquem claramente visíveis o tempo todo. Se o app renderizar de ponta a ponta, confira se apenas conteúdo não essencial é mostrado por trás das barras de sistema. Esse conteúdo pode não ser visível se o OEM do dispositivo impedir a configuração da cor ou da translucência 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 cobre a tela inteira de ponta a ponta, não presuma o tamanho, o número, o tipo ou a localização das barras de sistema. Em vez disso, use as APIs de encarte de janela para mostrar o conteúdo do app em relação às barras de sistema. Consulte Mostrar 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 para telas de formato irregular

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

Diagrama de um dispositivo Android Automotive OS com uma tela
      curvada no lado direito.
Figura 1: um dispositivo Android Automotive OS com 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 algo 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 comportasse em relação aos cortes da tela. Para fazer isso, use recursos configurando o atributo android:windowLayoutInDisplayCutoutMode para o tema do app ou durante a execução modificando o atributo da janela layoutInDisplayCutoutMode.

Como os tipos de corte da tela presentes nos dispositivos Android Automotive OS são diferentes daqueles usados em dispositivos móveis, não use LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT nem 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 usar o corte. Ao escolher a segunda opção, consulte Suporte a cortes de tela para saber mais sobre as APIs relacionadas.

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

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 de apps Android for Cars 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