Медиаприложения, использующие шаблоны из библиотеки автомобильных приложений, могут настраивать просмотр и воспроизведение медиафайлов, обеспечивая при этом оптимизацию для автомобильных экранов и минимизацию отвлекающих факторов во время вождения.
В этом руководстве предполагается, что у вас уже есть медиаприложение для воспроизведения аудио на телефоне, и что ваше медиаприложение соответствует архитектуре медиаприложений Android . Библиотека автомобильных приложений позволяет заменить встроенный интерфейс шаблонами вместо тех, которые созданы с использованием структуры данных MediaBrowser из библиотеки Build media apps for cars . Вам по-прежнему необходимо предоставить MediaSession для управления воспроизведением и объект MediaBrowserService , который используется для рекомендаций и других интеллектуальных функций.
Настройте манифест вашего приложения.
В дополнение к шагам, описанным в разделе «Использование библиотеки приложений Android для автомобилей» , от шаблонных медиаприложений требуются следующие действия:
Укажите поддержку категорий в вашем манифесте.
Вашему приложению необходимо объявить категорию автомобильных приложений androidx.car.app.category.MEDIA в фильтре намерений своего 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>
Для доступа к MediaPlaybackTemplate вашему приложению также необходимо указать разрешение androidx.car.app.MEDIA_TEMPLATES в файле манифеста:
<manifest ...>
...
<uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
...
</manifest>
Установите минимальный уровень API для автомобильных приложений.
Медиаприложения, использующие MediaPlaybackTemplate , поддерживаются только в CAL API 8. Убедитесь, что минимальный Car App API level установлен на 8.
<application ...>
...
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="8"/>
...
</application>
Объявить поддержку Android Auto
Убедитесь, что в манифест вашего приложения включено следующее:
<application>
...
<meta-data android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
...
</application>
Затем добавьте объявление шаблона в файл automotive_app_desc.xml в ваших XML-ресурсах. Оно должно выглядеть следующим образом:
<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
<uses name="media"/>
<uses name="template"/>
</automotiveApp>
Укажите значок авторства
Обязательно добавьте значок авторства для медиаприложений, созданных с использованием библиотеки автомобильных приложений.
Поддержка голосовых действий
Включите поддержку голосового управления в вашем приложении, чтобы пользователи могли выполнять распространенные действия без помощи рук. Более подробные инструкции по реализации см. в разделе «Поддержка голосовых действий для мультимедиа» . В шаблонном приложении для воспроизведения мультимедиа, если вы получаете голосовую команду, вам не нужно обновлять MediaBrowserService результатами поиска. Вместо этого рассмотрите возможность добавления действия в ваш шаблон воспроизведения мультимедиа, чтобы пользователь мог найти больше контента на основе этого запроса воспроизведения или поиска. Поддержка голосовых команд необходима для соответствия рекомендациям по качеству VC-1 .
Создайте свой шаблон воспроизведения
Шаблон MediaPlaybackTemplate отображает информацию о воспроизведении мультимедиа в медиатеке вашего автомобильного приложения. Этот шаблон позволяет установить заголовок с названием и настраиваемыми действиями, в то время как информация о мультимедиа и элементы управления воспроизведением заполняются хостом на основе состояния MediaSession вашего приложения.

Рисунок 1: MediaPlaybackTemplate с действием в заголовке, открывающим очередь воспроизведения вверху.
В этом примере кода показано, как создать шаблон воспроизведения, который задает действие в заголовке, позволяющее пользователю перейти к экрану с очередью песен.
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()
При использовании MediaPlaybackTemplate зарегистрируйте токен MediaSession с помощью MediaPlaybackManager в вашем CarAppService . В противном случае при отправке MediaPlaybackTemplate на хост отобразится ошибка.
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 необходим для предоставления Android Auto информации о воспроизведении мультимедиа и элементов управления. Это также важно для хоста, чтобы создавать уведомления, специфичные для мультимедиа.
Организуйте медиафайлы с помощью шаблонов.
Для организации медиафайлов для просмотра, таких как песни или альбомы, мы рекомендуем использовать SectionedItemTemplate , который позволяет использовать GridSection и RowSection вместе для создания макетов, сочетающих списки изображений и текстовых элементов.

Рисунок 2: Шаблон SectionedItemTemplate , содержащий RowSection , за которым следует GridSection
Использование SectionedItemTemplate внутри TabTemplate
Один из удобных способов классификации медиафайлов в вашем приложении — использование SectionedItemTemplate внутри TabTemplate .
val template =
SectionedItemTemplate.Builder()...build();
val tabTemplate =
TabTemplate.Builder(tabCallback)
.setTabContents(TabContents.Builder(template).build)
.setHeaderAction(Action.APP_ICON)
…
.build();
Более подробную информацию о том, как разработать пользовательский интерфейс вашего медиаприложения с помощью этих шаблонов, см. в разделе «Медиаприложения» .
Переход к элементам управления воспроизведением
При просмотре медиафайлов важно, чтобы пользователь мог быстро перейти к шаблону MediaPlaybackTemplate с минимальным отвлечением внимания. Для соответствия требованиям качества MFT-1 ваше приложение должно иметь возможность доступа к MediaPlaybackTemplate со всех экранов просмотра медиафайлов.
Если вы используете SectionedItemTemplate этого можно добиться, добавив плавающую кнопку действия, которая перенаправляет на экран воспроизведения мультимедиа. Для других шаблонов это можно сделать с помощью действия в заголовке.