O Android Automotive OS permite que os usuários instalem apps no carro. Para alcançar os usuários nessa plataforma, você precisa distribuir um app otimizado para motoristas que seja compatível com o Android Automotive OS. É possível reutilizar quase todo o código e os recursos do seu app original no app Android Auto, mas é necessário criar uma versão separada que atenda aos requisitos nesta página.
Visão geral do desenvolvimento
Adicionar suporte para o Android Automotive OS exige apenas algumas etapas, conforme descrito nas seções a seguir:
- Ativar recursos automotivos no Android Studio.
- Criar um módulo automotivo.
- Atualizar suas dependências do Gradle.
- Implementar atividades de configurações e login (opcional).
- Opcionalmente, Leia as dicas do host de mídia.
Considerações sobre o design
O Android Automotive OS cuida do layout do conteúdo de mídia que recebe do serviço de navegação de mídia do app. Isso significa que o app não desenha a interface nem inicia nenhuma atividade quando um usuário aciona a reprodução de mídia.
Se você estiver implementando atividades de configuração ou login, elas precisarão ser otimizadas para veículos. Consulte as diretrizes de design do Android Automotive OS ao projetar essas áreas do seu app.
Configurar seu projeto
É necessário configurar várias partes do projeto do seu app para ativar o suporte para o Android Automotive OS.
Ativar recursos automotivos no Android Studio
Use o Android Studio 4.0 ou posterior para garantir que todos os recursos do Automotive OS estejam ativados.
Criar um módulo automotivo
Alguns componentes do Android Automotive OS, como o manifesto, têm requisitos específicos da plataforma. Crie um módulo que possa manter o código desses componentes separado do restante do seu programa, como o código usado no app para smartphones.
Siga as etapas abaixo para adicionar um módulo automotivo ao seu projeto:
- No Android Studio, clique em File > New > New Module.
- Selecione Automotive Module e clique em Next.
- Preencha o campo Application/Library name. Esse é o nome do seu app que os usuários veem no Android Automotive OS.
- Preencha o campo Module name.
- Ajuste o Package name de acordo com o nome do seu app.
Selecione API 28: Android 9.0 (Pie) como Minimum SDK e clique em Next.
Todos os carros que oferecem suporte para o Android Automotive OS executam o Android 9 (nível 28 da API) ou uma versão mais recente. Portanto, a seleção desse valor abrange todos os carros compatíveis.
Selecione No Activity e clique em Finish.
Depois de criar seu módulo no Android Studio, abra o AndroidManifest.xml
no
seu novo módulo automotivo:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.media">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
</manifest>
O elemento application
tem algumas informações padrão do app, bem como um elemento
uses-feature
que declara suporte para o Android Automotive OS. Observe que não
há atividades declaradas no manifesto.
Se você vai implementar configurações ou login, pode adicionar essas atividades aqui. Essas atividades são acionadas pelo sistema usando intents explícitas e são as únicas atividades declaradas no manifesto para seu app Android Automotive OS.
Depois de adicionar qualquer atividade de configurações ou login, conclua o arquivo de manifesto
definindo o atributo android:appCategory="audio"
no elemento application
e adicionando os seguintes elementos uses-feature
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.media"> <application android:allowBackup="true" android:appCategory="audio" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" /> <uses-feature android:name="android.hardware.type.automotive" android:required="true" /> <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" /> </manifest>
Definir explicitamente esses recursos como required="false"
garante que
o app não entre em conflito com os recursos de hardware disponíveis nos dispositivos
Automotive OS.
Declarar suporte de mídia para o Android Automotive OS
Use esta entrada de manifesto para declarar que o app oferece suporte ao Android Automotive OS:
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
Essa entrada de manifesto se refere a um arquivo XML que declara a quais recursos automotivos seu app oferece suporte.
Para indicar que você tem um app de música, adicione um
arquivo XML chamado automotive_app_desc.xml
ao diretório res/xml/
no
projeto. Inclua o seguinte conteúdo neste arquivo:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
Filtros de intent
O Android Automotive OS usa intents explícitas para acionar atividades no seu app
de mídia. Não inclua atividades que tenham filtros de intent
CATEGORY_LAUNCHER
ou ACTION_MAIN
no arquivo de manifesto.
Atividades como a do exemplo a seguir geralmente são destinadas a um smartphone ou outro dispositivo móvel. Declare essas atividades no módulo que cria o app para smartphones, não no módulo que cria o app Android Automotive OS.
<activity android:name=".MyActivity">
<intent-filter>
<!-- You can't use either of these intents for Android Automotive OS -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--
In their place, you can include other intent filters for any activities
that your app needs for Android Automotive OS, such as settings or
sign-in activities.
-->
</intent-filter>
</activity>
Atualizar as dependência do Gradle
Recomendamos manter o serviço de navegação de mídia em um módulo separado que você compartilhe entre o app para smartphones e o módulo automotivo. Se você estiver usando essa abordagem, será necessário atualizar o módulo automotivo para incluir o módulo compartilhado, conforme mostrado no seguinte snippet:
Groovy
buildscript { ... dependencies { ... implementation project(':shared_module_name') } }
Kotlin
buildscript { ... dependencies { ... implementation(project(":shared_module_name")) } }
Implementar atividades de configurações e login
Além do serviço de navegação de mídia, você também pode fornecer atividades de configurações e login otimizadas para veículos ao app Android Automotive OS. Essas atividades permitem que você forneça funcionalidades de apps que não estão incluídas nas APIs Android Media.
Implemente essas atividades somente se o app Android Automotive OS precise de login dos usuários ou de configurações específicas. Essas atividades não são usadas pelo Android Auto.
Fluxos de trabalho de atividades
O diagrama a seguir mostra como um usuário interage com suas atividades de configurações e login usando o Android Automotive OS:
Diminuir as distrações nas suas atividades de configurações e de login
Para garantir que suas atividades de configurações e/ou de login só estejam disponíveis para uso
com o veículo do usuário estacionado, verifique se os elementos <activity>
não incluem os seguintes elementos <meta-data>
. Se um elemento desse tipo estiver presente,
seu app será rejeitado durante a revisão.
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
Adicionar uma atividade de configurações
Adicione uma atividade de configurações otimizada para veículos para que os usuários possam definir as configurações do seu app no carro. Sua atividade de configurações também pode oferecer outros fluxos de trabalho, como fazer login, sair ou trocar de conta. Lembre-se de que essa atividade só é acionada por um app em execução no Android Automotive OS. Os apps para smartphones conectados ao Android Auto não usam esse recurso.
Declarar uma atividade de configurações
Declare sua atividade de configurações no arquivo de manifesto do seu app, conforme mostrado no seguinte snippet de código:
<application>
...
<activity android:name=".AppSettingsActivity"
android:exported="true"
android:theme="@style/SettingsActivity"
android:label="@string/app_settings_activity_title">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
</intent-filter>
</activity>
...
</application>
Implementar sua atividade de configurações
Quando um usuário inicia seu app, o Android Automotive OS detecta a
atividade de configurações que você declarou e exibe uma funcionalidade, como um ícone.
O usuário pode selecionar essa funcionalidade ou tocar nela usando o tela do carro para navegar
para a atividade. O Android Automotive OS envia a intent
ACTION_APPLICATION_PREFERENCES
, que solicita que seu app inicie a atividade de configurações.
O restante desta seção mostra como você pode adaptar o código do app de amostra Universal Android Music Player (UAMP) para implementar uma atividade de configurações para o app.
Para começar, baixe o exemplo de código:
# Clone the UAMP repositorygit clone https://github.com/android/uamp.git
# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME
# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
Para implementar sua atividade, siga estas etapas:
- Copie a pasta
automotive/automotive-lib
para seu módulo automotivo. - Defina uma árvore de preferências como em
automotive/src/main/res/xml/preferences.xml
. Implemente um
PreferenceFragmentCompat
que sua atividade de configurações mostre. Para mais informações, consulte os arquivosSettingsFragment.kt
eSettingsActivity.kt
no UAMP e o Guia de configurações do Android.
Ao implementar a atividade de configurações, considere estas práticas recomendadas para usar alguns dos componentes na biblioteca Preference:
- O app não pode ter mais de dois níveis de profundidade abaixo da visualização principal na atividade de configurações.
- Use uma
ListPreference
, em vez de umaDropDownPreference
. - Componentes organizacionais:
PreferenceScreen
- Este precisa ser o nível superior da sua árvore de preferências.
PreferenceCategory
- Usada para agrupar objetos
Preference
. - Inclua um
title
.
- Usada para agrupar objetos
- Inclua uma
key
e umtitle
em todos os componentes a seguir. Também é possível incluir umsummary
, umicon
ou ambos:Preference
- Personalize a lógica no callback
onPreferenceTreeClick()
da sua implementaçãoPreferenceFragmentCompat
.
- Personalize a lógica no callback
CheckBoxPreference
- Pode ter
summaryOn
ousummaryOff
em vez desummary
como texto condicional.
- Pode ter
SwitchPreference
- Pode ter
summaryOn
ousummaryOff
em vez desummary
como texto condicional. - Pode ter
switchTextOn
ouswitchTextOff
.
- Pode ter
SeekBarPreference
- Inclua um
min
, ummax
e umdefaultValue
.
- Inclua um
EditTextPreference
- Inclua
dialogTitle
,positiveButtonText
enegativeButtonText
. - Pode ter
dialogMessage
e/oudialogLayoutResource
.
- Inclua
com.example.android.uamp.automotive.lib.ListPreference
- É derivado principalmente de
ListPreference
. - Usado para mostrar uma lista de escolha única de objetos
Preference
. - Precisa ter uma matriz de
entries
eentryValues
correspondentes.
- É derivado principalmente de
com.example.android.uamp.automotive.lib.MultiSelectListPreference
- É derivado principalmente de
MultiSelectListPreference
. - Usado para exibir uma lista de múltipla escolha de objetos
Preference
. - Precisa ter uma matriz de
entries
eentryValues
correspondentes.
- É derivado principalmente de
Adicionar uma atividade de login
Se o app exigir que um usuário faça login antes do uso, adicione uma atividade de login otimizada para veículos que processe o login e o logout do app. Você também pode adicionar fluxos de trabalho de login e logout a uma atividade de configurações, mas vai precisar usar uma atividade de login dedicada se o app não puder ser usado até que o usuário faça login. Lembre-se de que essa atividade só é acionada por um app em execução no Android Automotive OS. Os apps para smartphones conectados ao Android Auto não usam esse recurso.
Login obrigatório na inicialização do app
Para exigir que um usuário faça login para usar seu app, o serviço de navegação de mídia precisa fazer o seguinte:
- No método
onLoadChildren()
do serviço, enviar resultadosnull
usando o métodosendResult()
. - Definir o
PlaybackStateCompat
da sessão de mídia comoSTATE_ERROR
usando o métodosetState()
. Isso informa ao Android Automotive OS que nenhuma outra operação pode ser executada até que o erro seja resolvido. - Definir o código de erro
PlaybackStateCompat
da sessão de mídia comoERROR_CODE_AUTHENTICATION_EXPIRED
. Isso informa ao Android Automotive OS que o usuário precisa de autenticação. - Definir a mensagem de erro
PlaybackStateCompat
da sessão de mídia usando o métodosetErrorMessage()
. Como essa mensagem de erro é voltada ao usuário, ela precisa ser traduzida para a localidade dele. Definir os extras
PlaybackStateCompat
da sessão de mídia usando o métodosetExtras()
. Inclua as duas chaves a seguir:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: uma string mostrada no botão que inicia o fluxo de trabalho de login. Como essa string é voltada ao usuário, ela precisa ser traduzida para a localidade atual dele.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: umaPendingIntent
que direciona o usuário para sua atividade de login quando ele toca no botão referido porPLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
.
O snippet de código a seguir mostra como seu app pode exigir que o usuário faça login antes de usá-lo:
Kotlin
import androidx.media.utils.MediaConstants val signInIntent = Intent(this, SignInActivity::class.java) val signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0) val extras = Bundle().apply { putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in" ) putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent ) } val playbackState = PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build() mediaSession.setPlaybackState(playbackState)
Java
import androidx.media.utils.MediaConstants; Intent signInIntent = new Intent(this, SignInActivity.class); PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0); Bundle extras = new Bundle(); extras.putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in"); extras.putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent); PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build(); mediaSession.setPlaybackState(playbackState);
Depois que o usuário for autenticado com êxito, defina o PlaybackStateCompat
de volta a um estado diferente de STATE_ERROR
.
Em seguida, leve o usuário de volta ao Android Automotive OS chamando o método
finish()
da atividade.
Implementar sua atividade de login
O Google oferece uma variedade de ferramentas de identificação que podem ser usadas para o login dos usuários no seu app, quando estiverem no carro. Algumas ferramentas, como o Firebase Authentication, oferecem kits de ferramentas de pilha completa que podem ajudar a criar experiências de autenticação personalizadas. Outras ferramentas aproveitam as credenciais do usuário ou outras tecnologias existetes para criar experiências de login simplificadas para os usuários.
As ferramentas a seguir podem ajudar a criar uma experiência de login mais fácil para os usuários que já se conectaram a outro dispositivo:
- Inscrição e login com um toque: se você já implementou o recurso um toque em outros dispositivos, como o app para smartphones, implemente também no seu app Android Automotive OS para oferecer suporte a usuários desse recurso.
- Login do Google: se você já implementou o Login do Google em outros dispositivos, como o app para smartphones, implemente também no app Android Automotive OS para oferecer suporte a usuários já existentes do Login do Google.
- Preenchimento automático do Google: se os usuários tiverem ativado o preenchimento automático do Google em outros dispositivos Android, as credenciais deles serão salvas no Gerenciador de senhas do Google. Quando esses usuários fazem login no seu app Android Automotive OS, o preenchimento automático do Google sugere credenciais salvas relevantes. O uso do preenchimento automático do Google não exige esforço no desenvolvimento de aplicativos. No entanto, os desenvolvedores podem otimizar os próprios apps para ter resultados de melhor qualidade. Todos os dispositivos que executam o Android Oreo 8.0 (nível 26 da API) ou mais recente (incluindo o Android Automotive OS) oferecem suporte ao preenchimento automático do Google.
Usar o AccountManager
Os apps Android Automotive OS que têm autenticação precisam usar o AccountManager pelos seguintes motivos:
- Melhor UX e gerenciamento de contas facilitado: os usuários podem gerenciar com facilidade todas as contas pelo menu de contas nas configurações do sistema, incluindo o login e o logout.
- Experiências de "visitante": carros são dispositivos compartilhados. Isso significa que os OEMs podem ativar
experiências para visitantes no veículo quando não for possível adicionar contas. Essa
restrição é alcançada usando
DISALLOW_MODIFY_ACCOUNTS
paraAccountManager
.
Permissões
Se você precisar solicitar permissões do usuário, use o mesmo fluxo da atividade de autenticação ou de configurações no diagrama de fluxos de trabalho de atividades mostrado em uma seção anterior.
Ler dicas de organizadores de mídia
Dependendo do aplicativo do sistema (incluindo a versão) que se conecta ao serviço de navegação de mídia, o app pode receber os seguintes extras:
Tratamento de erros
Os erros em apps de mídia no Android Automotive OS são comunicados pelo
PlaybackStateCompat
da sessão de mídia. Para todos os erros, defina uma mensagem
e um código adequados no PlaybackStateCompat
. Isso faz com que um Toast
apareça
na interface.
Quando ocorrer um erro, mas a reprodução puder continuar, é preciso emitir um erro não fatal. Por exemplo, um usuário pode ouvir música em um app antes de fazer login, mas a conta precisa estar conectada para que ele possa pular uma música. Quando você usa um erro não fatal, o sistema pode sugerir que o usuário faça login sem interromper a reprodução do item de mídia atual.
Quando você emitir um erro não fatal, preserve o restante do
PlaybackStateCompat
no estado em que se encontra, além do código e da mensagem do erro. O uso dessa
abordagem permite que a reprodução do item de mídia atual continue enquanto o usuário
decide se quer ou não fazer login.
Quando não for possível reproduzir, por exemplo, se não houver conexão de Internet e
nenhum conteúdo off-line, defina o estado PlaybackStateCompat
como STATE_ERROR
.
Nas atualizações subsequentes do PlaybackStateCompat
, limpe todos os códigos
e mensagens de erro para evitar a exibição de vários avisos para o mesmo erro.
Se em algum momento não for possível carregar uma árvore de navegação, por exemplo, se você
exigir autenticação e o usuário não tiver feito login, envie uma árvore de
navegação vazia. Para indicar isso, retorne um resultado nulo de onLoadChildren()
para
o nó de mídia raiz. Quando isso acontece, o sistema mostra um erro em tela cheia
com a mensagem de erro definida no PlaybackStateCompat
.
Erros acionáveis
Se um erro for acionável, defina também os dois extras a seguir no
PlaybackStateCompat
:
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL
: um rótulo para o botão a ser clicado para resolver o erro. Como essa string é voltada ao usuário, ela precisa ser traduzida para a localidade atual dele.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT
: aPendingIntent
que o botão executa para resolver o erro, como ao iniciar a atividade de login.
Os erros acionáveis aparecem como uma Dialog
e podem ser resolvidos pelos usuários somente quando o
carro está parado.
Testar casos de erro
Verifique se o app processa os erros corretamente em todos os cenários, incluindo estes:
- Níveis diferentes do produto: por exemplo, sem custo ou premium, com ou sem login.
- Diferentes status de direção do veículo: por exemplo, estacionado ou em movimento.
- Estados de conectividade diferentes: por exemplo, on-line ou off-line.
Outras considerações
Lembre-se destas considerações quando estiver desenvolvendo seu app Android Automotive OS:
Conteúdo off-line
Se for o caso, implemente suporte para reprodução off-line. Os carros com Android Automotive OS precisam ter conectividade de dados própria, o que significa que um plano de dados está incluído no custo do veículo ou é pago pelo usuário. No entanto, espera-se que os carros tenham mais conectividade variável do que os dispositivos móveis.
Confira alguns pontos importantes ao considerar sua estratégia de suporte off-line:
- O melhor momento para baixar conteúdo é enquanto o app está em uso.
- Não suponha que o Wi-Fi esteja disponível. Um carro pode nunca entrar no alcance do Wi-Fi, ou o OEM pode ter desativado o Wi-Fi em favor de uma rede celular.
- Não há problema em armazenar em cache o conteúdo que os usuários esperam usar, mas recomendamos permitir que eles mudem esse comportamento na atividade de configurações.
- O espaço em disco nos carros varia. Por isso, ofereça aos usuários uma maneira de excluir conteúdos off-line, como uma opção na sua atividade de configurações.
Suporte à WebView
O Android Automotive OS oferece suporte a WebViews, mas elas são permitidas apenas nas atividades de configuração e login. As atividades que usam WebView precisam ter uma funcionalidade "fechada" ou "retorno" fora da WebView.
Confira alguns exemplos de casos de uso aceitáveis para WebViews:
- Exibição da Política de Privacidade, dos Termos de Serviço ou de outros links relacionados à lei no serviço de configurações.
- Um fluxo baseado na Web na sua atividade de login.
Ao usar uma WebView, você pode ativar o JavaScript.
Proteger a WebView
Tome todas as precauções para garantir que a WebView não seja um
ponto de entrada para a Internet. Confira no snippet de código abaixo um
exemplo de como bloquear a WebView para o URL usado na chamada
loadUrl()
e evitar redirecionamentos. É altamente recomendável implementar proteções como essa
quando possível, por exemplo, ao mostrar
links relacionados à lei.
Kotlin
override fun shouldOverrideUrlLoading(webView: WebView, webResourceRequest: WebResourceRequest): Boolean { val originalUri: Uri = Uri.parse(webView.originalUrl) // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.url)) { return false } if (webResourceRequest.isRedirect) { logger.w("Redirect detected, not following") return true } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url) logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri)) return true }
Java
@Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) { Uri originalUri = Uri.parse(webView.getOriginalUrl()); // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.getUrl())) { return false; } if (webResourceRequest.isRedirect()) { logger.w("Redirect detected, not following"); return true; } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl()); logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri)); return true; }
Nomes de pacote
Como você distribui um pacote de aplicativo Android (APK) separado para o Android Automotive OS, é possível reutilizar o nome do pacote do seu app para dispositivos móveis ou criar um novo nome de pacote. Se você usar um nome de pacote diferente, o app terá duas páginas "Detalhes do app" separadas para a Play Store. Se você reutilizar o nome do pacote atual, o app vai ter uma única página de detalhes nas duas plataformas.
Isso é predominantemente uma decisão comercial. Por exemplo, se você tem uma equipe trabalhando no app para dispositivos móveis e uma equipe separada trabalhando no app Android Automotive OS, pode fazer sentido ter nomes de pacotes diferentes e permitir que cada equipe gerencie as próprias páginas "Detalhes do app". Não há grande diferença no esforço técnico necessário para usar qualquer uma das abordagens.
A tabela a seguir resume algumas das principais diferenças importantes entre manter o nome do pacote atual e usar um novo nome:
Recurso | Mesmo nome de pacote | Novo nome do pacote |
---|---|---|
Página "Detalhes do app" | Uma | Várias |
Instalação espelhada | Sim: "reinstalação rápida de app" durante o assistente de configuração | Não |
Processo de análise da Play Store | Bloqueio de análises: se a análise falhar para um APK, os outros APKs enviados na mesma versão serão bloqueados | Análises individuais |
Estatísticas, métricas e vitals | Combinado: você pode filtrar por dados específicos de automóveis. | Separados |
Indexação e classificação na pesquisa | Com base na posição atual | Sem transferência |
Integração a outros apps | Provavelmente nenhuma mudança será necessária, supondo que o código de mídia seja compartilhado entre os dois APKs | Talvez seja necessário atualizar o app correspondente, como para a reprodução de URIs com o Google Assistente. |
Perguntas frequentes
Consulte as seções a seguir para ver respostas de algumas perguntas frequentes sobre o Android Automotive OS.
Hardware
Meu app tem acesso ao microfone?
Para apps voltados ao Android 10 (nível 29 da API) ou versões mais recentes, consulte a documentação sobre compartilhamento de entrada de áudio. Isso não é viável antes da API de nível 29.
A quais APIs de carro podemos ter acesso e como?
Você está limitado às APIs expostas pelo OEM. Os processos estão sendo desenvolvidos para padronizar o acesso a essas APIs.
Os apps podem acessar APIs de carro usando SetProperty()
e GetProperty()
no CarPropertyManager
.
Consulte o código-fonte
ou a documentação de referência para conferir uma
lista de todas as propriedades disponíveis. Se a propriedade estiver anotada
com @SystemApi
, ela será limitada a apps pré-carregados do sistema.
Há suporte para quais tipos de codecs de áudio?
Consulte os detalhes de codecs de áudio no CDD do Android.
Há suporte para o DRM da Widevine?
Sim. O DRM da Widevine (link em inglês) é compatível.
Desenvolvimento e teste
Há restrições ou recomendações quanto ao uso de SDKs e bibliotecas de terceiros?
Não temos diretrizes específicas sobre o uso de SDKs e bibliotecas de terceiros. Se você optar por usar SDKs e bibliotecas de terceiros, ainda será responsável por obedecer a todos os requisitos de qualidade de apps para carros.
Posso usar um serviço em primeiro plano?
O único caso de uso permitido para um serviço em primeiro plano é o download de conteúdo para uso off-line. Se você quiser ter suporte para outro caso de uso para um serviço em primeiro plano, entre em contato com nossa equipe usando o grupo de discussão do Android Automotive OS.
Publicar apps Android Automotive OS
Como faço para publicar meu app Android Automotive OS usando o Google Play Console?
Para saber como publicar seu app Android Automotive OS usando o Google Play Console, consulte Distribuir para carros.
Outros recursos
Para saber mais sobre o Android Automotive OS, consulte os seguintes recursos.
Amostras
- Universal Android Music Player (link em inglês)
Guias
- Design para direção
- Como usar o app de teste dos controles de mídia
- Notificações no Android Automotive OS
- Qualidade do app Android para carros
Blogs (links em inglês)
- Atualizações do Android Automotive OS para desenvolvedores (link em inglês)
- Desenvolver apps para o Android Automotive OS
Vídeos
- Como criar apps de mídia para carros (Conferência de Desenvolvedores Android 2019) (em inglês)
- Como criar apps Android para carros (Google I/O 2019) (em inglês)
Informar um problema de mídia no SO Android Automotive
Se você encontrar um problema ao desenvolver seu app de mídia para o SO Android Automotive, poderá informá-lo usando o Google Issue Tracker. Preencha todas as informações solicitadas no modelo de problema.
Antes de informar um novo problema, verifique se ele já foi comunicado na lista. Inscreva-se e vote nos problemas clicando na estrela de um deles na lista de problemas. Para ver mais informações, consulte Como se inscrever em um problema.