Добавьте элементы управления воспроизведением в свое приложение

Приложению, воспроизводящему мультимедиа, требуются компоненты пользовательского интерфейса для отображения мультимедиа и управления воспроизведением. Библиотека Media3 включает модуль пользовательского интерфейса, содержащий ряд компонентов пользовательского интерфейса. Чтобы зависеть от модуля пользовательского интерфейса, добавьте следующую зависимость:

Котлин

implementation("androidx.media3:media3-ui:1.4.1")

классный

implementation "androidx.media3:media3-ui:1.4.1"

Самый важный компонент — PlayerView , представление для воспроизведения мультимедиа. PlayerView отображает видео, изображения, субтитры и обложки альбомов во время воспроизведения, а также элементы управления воспроизведением.

PlayerView имеет метод setPlayer для подключения и отсоединения (путем передачи null ) экземпляров проигрывателя.

Просмотр игрока

PlayerView можно использовать для воспроизведения видео, изображений и аудио. Он визуализирует видео и субтитры в случае воспроизведения видео, растровые изображения для воспроизведения изображений и может отображать изображения, включенные в качестве метаданных в аудиофайлы. Вы можете включить его в файлы макета, как и любой другой компонент пользовательского интерфейса. Например, PlayerView можно включить в следующий XML-код:

<androidx.media3.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:show_buffering="when_playing"
    app:show_shuffle_button="true"/>

Приведенный выше фрагмент показывает, что PlayerView предоставляет несколько атрибутов. Эти атрибуты можно использовать для настройки поведения представления, а также его внешнего вида. Большинству этих атрибутов соответствуют соответствующие методы установки, которые можно использовать для настройки представления во время выполнения. В документации PlayerView Java эти атрибуты и методы установки перечислены более подробно.

После того как представление объявлено в файле макета, его можно просмотреть в методе onCreate действия:

Котлин

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView = findViewById(R.id.player_view)
}

Ява

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // ...
  playerView = findViewById(R.id.player_view);
}

Когда проигрыватель инициализирован, его можно присоединить к представлению, вызвав setPlayer :

Котлин

// Instantiate the player.
val player = ExoPlayer.Builder(context).build()
// Attach player to the view.
playerView.player = player
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()

Ява

// Instantiate the player.
player = new ExoPlayer.Builder(context).build();
// Attach player to the view.
playerView.setPlayer(player);
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.prepare();

Выберите тип поверхности

Атрибут surface_type PlayerView позволяет вам установить тип поверхности, используемой для воспроизведения видео. Помимо значений spherical_gl_surface_view (специальное значение для воспроизведения сферического видео) и video_decoder_gl_surface_view (для рендеринга видео с использованием модулей рендеринга расширений), допустимыми значениями являются surface_view , texture_view и none . Если представление предназначено только для воспроизведения звука, none следует использовать, чтобы избежать необходимости создавать поверхность, поскольку это может оказаться дорогостоящим.

Если представление предназначено для обычного воспроизведения видео, следует использовать surface_view texture_view . SurfaceView имеет ряд преимуществ перед TextureView при воспроизведении видео:

  • Значительно более низкое энергопотребление на многих устройствах.
  • Более точная синхронизация кадров, что обеспечивает более плавное воспроизведение видео.
  • Поддержка вывода HDR-видео более высокого качества на совместимых устройствах.
  • Поддержка безопасного вывода при воспроизведении контента, защищенного DRM.
  • Возможность рендеринга видеоконтента с полным разрешением дисплея на устройствах Android TV с возможностью повышения уровня пользовательского интерфейса.

Поэтому там, где это возможно, следует отдавать предпочтение SurfaceView перед TextureView . TextureView следует использовать только в том случае, если SurfaceView не соответствует вашим потребностям. Одним из примеров является ситуация, когда требуется плавная анимация или прокрутка поверхности видео до Android 7.0 (уровень API 24), как описано в следующих примечаниях. В этом случае предпочтительнее использовать TextureView только в том случае, если SDK_INT меньше 24 (Android 7.0), а в противном случае — SurfaceView .

Навигация по D-pad на Android TV

Пульт дистанционного управления Android TV оснащен крестовиной, которая отправляет команды, которые поступают в качестве ключевого события при dispatchKeyEvent(KeyEvent) вашего Activity . Их необходимо делегировать представлению игрока:

Котлин

override fun dispatchKeyEvent(event: KeyEvent?): Boolean{
  return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event)
}

Ява

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

Запрос фокуса для просмотра проигрывателя важен для навигации по элементам управления воспроизведением и пропуска рекламы. Рассмотрите возможность запроса фокуса в onCreate Activity :

Котлин

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView.requestFocus()
  // ...
}

Ява

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    playerView.requestFocus();
    // ...
}

Если вы используете Compose на Android TV, вам необходимо сделать AndroidView фокусируемым и делегировать событие, передав параметр-модификатор в AndroidView соответствующим образом:

AndroidView(
  modifier = modifier
    .focusable()
    .onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
  factory = { playerView }
)

Переопределить чертежи

PlayerView использует PlayerControlView для отображения элементов управления воспроизведением и индикатора выполнения. Drawables, используемые PlayerControlView могут быть переопределены drawables с теми же именами, которые определены в вашем приложении. См. Javadoc PlayerControlView для получения списка элементов управления, которые можно переопределить.

Дальнейшая настройка

Там, где требуется настройка, выходящая за рамки описанной выше, мы ожидаем, что разработчики приложений будут реализовывать свои собственные компоненты пользовательского интерфейса, а не использовать те, которые предоставляются модулем пользовательского интерфейса Media3.