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.
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.
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.
Como navegar até os controles 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.