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.
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.
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.
Navegar até os controles de reprodução
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.