Adicionar compatibilidade com o Android Automotive OS ao seu app de mídia

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:

  1. Ativar recursos automotivos no Android Studio.
  2. Criar um módulo automotivo.
  3. Atualizar suas dependências do Gradle.
  4. Implementar atividades de configurações e login (opcional).
  5. 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:

  1. No Android Studio, clique em File > New > New Module.
  2. Selecione Automotive Module e clique em Next.
  3. Preencha o campo Application/Library name. Esse é o nome do seu app que os usuários veem no Android Automotive OS.
  4. Preencha o campo Module name.
  5. Ajuste o Package name de acordo com o nome do seu app.
  6. 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.

  7. 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:

my-auto-module/build.gradle

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:

Fluxos de trabalho para atividades de configurações e login

Figura 1. Fluxos de trabalho para atividades de configurações e de login.

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 repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

Para implementar sua atividade, siga estas etapas:

  1. Copie a pasta automotive/automotive-lib para seu módulo automotivo.
  2. Defina uma árvore de preferências como em automotive/src/main/res/xml/preferences.xml.
  3. Implemente um PreferenceFragmentCompat que sua atividade de configurações mostre. Para mais informações, consulte os arquivos SettingsFragment.kt e SettingsActivity.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 uma DropDownPreference.
  • Componentes organizacionais:
  • Inclua uma key e um title em todos os componentes a seguir. Também é possível incluir um summary, um icon ou ambos:
    • Preference
      • Personalize a lógica no callback onPreferenceTreeClick() da sua implementação PreferenceFragmentCompat.
    • CheckBoxPreference
      • Pode ter summaryOn ou summaryOff em vez de summary como texto condicional.
    • SwitchPreference
      • Pode ter summaryOn ou summaryOff em vez de summary como texto condicional.
      • Pode ter switchTextOn ou switchTextOff.
    • SeekBarPreference
      • Inclua um min, um max e um defaultValue.
    • EditTextPreference
      • Inclua dialogTitle, positiveButtonText e negativeButtonText.
      • Pode ter dialogMessage e/ou dialogLayoutResource.
    • 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 e entryValues correspondentes.
    • 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 e entryValues correspondentes.

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:

  1. No método onLoadChildren() do serviço, enviar resultados null usando o método sendResult().
  2. Definir o PlaybackStateCompat da sessão de mídia como STATE_ERROR usando o método setState(). Isso informa ao Android Automotive OS que nenhuma outra operação pode ser executada até que o erro seja resolvido.
  3. Definir o código de erro PlaybackStateCompat da sessão de mídia como ERROR_CODE_AUTHENTICATION_EXPIRED. Isso informa ao Android Automotive OS que o usuário precisa de autenticação.
  4. Definir a mensagem de erro PlaybackStateCompat da sessão de mídia usando o método setErrorMessage(). Como essa mensagem de erro é voltada ao usuário, ela precisa ser traduzida para a localidade dele.
  5. Definir os extras PlaybackStateCompat da sessão de mídia usando o método setExtras(). Inclua as duas chaves a seguir:

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 para AccountManager.

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:

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

Guias

Blogs (links em inglês)

Vídeos

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.

Informar novo 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.