Criar um app de mídia com modelo

Os apps de música com modelos estão na versão Beta
No momento, qualquer pessoa pode publicar apps de música com modelos nas faixas de teste interno e fechado da Google Play Store. A publicação em faixas abertas e de produção será permitida em uma data posterior.

Os apps de música que usam os modelos da biblioteca Car App podem personalizar a experiência de navegação e reprodução de mídia, garantindo que ela seja otimizada para telas de carros e minimize as distrações ao dirigir.

Este guia presume que você já tenha um app de música que reproduz áudio em um smartphone e que ele seja compatível com a arquitetura de app de música do Android. A biblioteca Car App oferece a capacidade de substituir a experiência no app por modelos em vez daqueles criados usando a estrutura de dados Criar apps de música para carros MediaBrowser. Você ainda precisa fornecer uma MediaSession para controles de reprodução e um MediaBrowserService, que é usado para recomendações e outras experiências inteligentes.

Configurar o manifesto do app

Além das etapas descritas em Como usar a biblioteca Android para carros App, os apps de música com modelos precisam atender aos seguintes requisitos:

Declarar suporte à categoria no manifesto

Seu app precisa declarar a androidx.car.app.category.MEDIA categoria do app para carros no filtro de intent de CarAppService.

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.MEDIA"/>
      </intent-filter>
    </service>
    ...
<application>

Para ter acesso ao MediaPlaybackTemplate, seu app também precisa declarar a permissão androidx.car.app.MEDIA_TEMPLATES no arquivo de manifesto:

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
  ...
</manifest>

Definir o nível mínimo da API do app para carros

Os apps de música que usam o MediaPlaybackTemplate só são compatíveis com a API 8 da CAL. Verifique se o Car App API level mínimo está definido como 8.

<application ...>
  ...
  <meta-data
    android:name="androidx.car.app.minCarApiLevel"
    android:value="8"/>
  ...
</application>

Declarar compatibilidade com o Android Auto

Verifique se o seguinte está incluído no manifesto do app:

<application>
  ...
  <meta-data android:name="com.google.android.gms.car.application"
      android:resource="@xml/automotive_app_desc"/>
  ...
</application>

Em seguida, adicione a declaração template a automotive_app_desc.xml nos recursos XML. Ela deve ter esta aparência:

<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
 <uses name="media"/>
 <uses name="template"/>
</automotiveApp>

Fornecer um ícone de atribuição

Adicione um ícone de atribuição para apps de música criados usando a biblioteca Car App.

Oferecer compatibilidade com comandos de voz

Ative os comandos de voz no app para permitir que os usuários concluam ações comuns sem usar as mãos. Consulte Oferecer compatibilidade com comandos de voz para mídia para instruções de implementação mais detalhadas. Com um app de música com modelos, se você receber um comando de voz, não precisará atualizar o MediaBrowserService com os resultados da pesquisa. Em vez disso, considere adicionar uma ação no modelo de reprodução de mídia para permitir que o usuário encontre mais conteúdo com base na reprodução ou na consulta de pesquisa. O suporte a comandos de voz é necessário para atender à VC-1 diretriz de qualidade.

Criar o modelo de reprodução

O MediaPlaybackTemplate mostra informações de reprodução de mídia no app de música da biblioteca Car App. Esse modelo permite definir um cabeçalho com um título e ações personalizáveis, enquanto as informações de mídia e os controles de reprodução são preenchidos pelo host com base no estado da MediaSession do app.

Um player de música mostra &quot;Sounds of Spring&quot;, de Summer Fielding, com um retrato quadrado de uma mulher tocando violão.

Figura 1:MediaPlaybackTemplate com uma ação de cabeçalho para abrir a fila na parte de cima.

Este exemplo de código mostra como criar um modelo de reprodução de exemplo que define uma ação de cabeçalho que permite ao usuário navegar até uma tela com a fila de músicas.

val playbackTemplate = MediaPlaybackTemplate.Builder()
      .setHeader(
        Header.Builder()
          .setStartHeaderAction(Action.BACK)
          .addEndHeaderAction(
                Action.Builder()
                  .setTitle(model.context.getString(R.string.queue_button_title))
                  .setIcon(
                    CarIcon.Builder(
                        IconCompat.createWithResource(
                          model.context,
                          R.drawable.gs_queue_music_vd_theme_24,
                        ))
                      .build())
                  .setOnClickListener(showQueueScreen())
                  .build())
          .setTitle(model.context.getString(R.string.media_playback_view_title))
          .build())
      .build()

Ao usar MediaPlaybackTemplate, registre um MediaSession token usando o MediaPlaybackManager no seu CarAppService. Se isso não for feito, um erro será mostrado quando um MediaPlaybackTemplate for enviado ao host.

import androidx.car.app.media.MediaPlaybackManager


override fun onCreateSession(sessionInfo: SessionInfo): Session {
    return object : Session() {
        

        init {
          lifecycle.addObserver(
            LifecycleEventObserver { _, event ->
              if (event == ON_CREATE) {
                val token = ... // MediaSessionCompat.Token
                (carContext.getCarService(CarContext.MEDIA_PLAYBACK_SERVICE) as MediaPlaybackManager)
                  .registerMediaPlaybackToken(token)
              }
              ...
            }
          )
        }
    }
}

.registerMediaPlaybackToken é necessário para expor informações e controles de reprodução de mídia ao Android Auto. Isso também é importante para que o host crie notificações específicas de mídia.

Organizar mídia usando modelos

Para organizar a mídia para navegação, como músicas ou álbuns, recomendamos o uso do SectionedItemTemplate, que permite usar GridSection e RowSection juntos para criar layouts que misturam listas de imagens e itens de texto.

Uma interface de app de música mostra músicas e álbuns reproduzidos recentemente,
     incluindo duas linhas verticais e três retratos horizontais de arte de álbuns.

Figura 2:um SectionedItemTemplate contendo um RowSection seguido por um GridSection

Como usar SectionedItemTemplate em um TabTemplate

Uma maneira conveniente de categorizar a mídia no app é usar o SectionedItemTemplate em um TabTemplate.

val template =
      SectionedItemTemplate.Builder()...build();
val tabTemplate = 
      TabTemplate.Builder(tabCallback)
          .setTabContents(TabContents.Builder(template).build)
          .setHeaderAction(Action.APP_ICON)
          
          .build();

Para mais detalhes sobre como projetar a interface do usuário do app de música usando estes modelos, consulte Apps de música.

Ao navegar pela mídia, é importante que o usuário possa navegar rapidamente até o MediaPlaybackTemplate com o mínimo de distração. Para atender ao MFT-1 requisito de qualidade, seu app precisa ter uma maneira de acessar o MediaPlaybackTemplate em todas as telas de navegação de mídia.

Se você estiver usando SectionedItemTemplate, adicione um botão de ação flutuante que navega até a tela de reprodução de mídia. Para outros modelos, uma ação de cabeçalho é outra maneira de fazer isso.