Criar um app de mídia com modelo

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

Os apps de mídia 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 minimizando 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ídia do Android. A biblioteca de apps para carros permite substituir a experiência no app por modelos em vez de aqueles criados usando a estrutura de dados Criar apps de mídia para carros MediaBrowser. Você ainda precisa fornecer um 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 for Cars App, os seguintes requisitos são obrigatórios para apps de mídia com modelos:

Declarar suporte à categoria no manifesto

Seu app precisa declarar a categoria de app para carros androidx.car.app.category.MEDIA 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 Car App

Os apps de mídia que usam MediaPlaybackTemplate têm suporte apenas na API CAL 8. 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 os seguintes itens estão incluídos 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. Ele vai ficar assim:

<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ídia criados com a biblioteca Car App.

Oferecer compatibilidade com comandos de voz

Ative a voz no app para que os usuários possam realizar ações comuns sem usar as mãos. Consulte Suporte a comandos de voz para mídia para conferir instruções de implementação mais detalhadas. Com um app de mídia com modelo, se você receber um comando de voz, não será necessário atualizar o MediaBrowserService com os resultados da pesquisa. Em vez disso, adicione uma ação no modelo de reprodução de mídia para permitir que o usuário encontre mais conteúdo com base nessa consulta de reprodução ou pesquisa. A compatibilidade com comandos de voz é necessária para atender à diretriz de qualidade VC-1.

Criar seu modelo de reprodução

O MediaPlaybackTemplate mostra informações de reprodução de mídia na biblioteca de apps de mídia para carros. 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 do 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 token MediaSession usando o MediaPlaybackManager na CarAppService. Se isso não for feito, um erro será exibido 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)
              }
              ...
            }
          )
        }
    }
}

O .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 para mídia.

Organizar mídia usando modelos

Para organizar mídias para navegação, como músicas ou álbuns, recomendamos usar o SectionedItemTemplate, que permite usar o 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 tocados recentemente,
     incluindo duas linhas verticais e três retratos horizontais de capas de álbuns.

Figura 2. Uma SectionedItemTemplate contendo um RowSection seguido por um GridSection.

Como usar o SectionedItemTemplate dentro de um TabTemplate

Uma maneira conveniente de categorizar mídias no app é usar o SectionedItemTemplate dentro de um TabTemplate.

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

Para saber mais sobre como projetar a interface do usuário do seu app de mídia usando esses modelos, consulte Apps de mídia.

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 requisito de qualidade MFT-1, o 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 navegue até a tela de reprodução de mídia. Para outros modelos, uma ação de cabeçalho é outra maneira de fazer isso.