Dodaj elementy sterujące odtwarzaniem w aplikacji

Aplikacja odtwarzająca multimedia wymaga elementów interfejsu użytkownika do wyświetlania multimediów i sterowania odtwarzaniem. Biblioteka Media3 zawiera moduł interfejsu użytkownika, który zawiera wiele komponentów interfejsu. Aby utworzyć zależność od modułu interfejsu użytkownika, dodaj tę zależność:

Kotlin

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

Groovy

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

Najważniejszym elementem jest PlayerView, czyli widok odtwarzania multimediów. PlayerView wyświetla film, obrazy, napisy i okładkę albumu podczas odtwarzania, a także elementy sterujące odtwarzaniem.

PlayerView ma metodę setPlayer dołączania i odłączania (przez przekazywanie null) instancji odtwarzacza.

PlayerView

PlayerView może służyć do odtwarzania filmów, obrazów i dźwięku. W przypadku odtwarzania wideo renderuje ona filmy i napisy, a w przypadku obrazów – bitmapy. Może też wyświetlać elementy graficzne zawarte w metadanych plików audio. Możesz go umieścić w plikach układu tak samo jak każdy inny komponent UI. Na przykład pole PlayerView może być uwzględnione w tym pliku 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"/>

Fragment kodu powyżej pokazuje, że PlayerView zawiera kilka atrybutów. Za pomocą tych atrybutów możesz dostosować zachowanie widoku, a także jego wygląd i wygląd. Większość z tych atrybutów ma odpowiednie metody settera, których można używać do dostosowywania widoku w czasie wykonywania. W dokumentacji Javadoc dotyczącej klasy PlayerView znajdziesz więcej informacji o tych atrybutach i metodach settera.

Gdy widok zostanie zadeklarowany w pliku układu, można go wyszukać w metodie onCreate aktywności:

Kotlin

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

Java

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

Po zainicjowaniu odtwarzacza można go dołączyć do widoku, wywołując funkcję setPlayer:

Kotlin

// 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()

Java

// 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();

Wybieranie typu powierzchni

Atrybut surface_type elementu PlayerView pozwala ustawić typ powierzchni używanej do odtwarzania filmu. Oprócz wartości spherical_gl_surface_view (która jest wartością specjalną dla odtwarzania filmów sferycznych) i video_decoder_gl_surface_view (która służy do renderowania filmów za pomocą rendererów rozszerzeń) dozwolone wartości to surface_view, texture_viewnone. Jeśli widok służy tylko do odtwarzania dźwięku, należy użyć none, aby uniknąć tworzenia powierzchni, ponieważ może to być kosztowne.

Jeśli widok służy do odtwarzania zwykłego filmu, należy użyć parametru surface_view lub texture_view. SurfaceView ma szereg zalet w porównaniu z TextureView w przypadku odtwarzania filmów:

  • znacznie obniżyć zużycie energii na wielu urządzeniach;
  • Dokładniejsze ustalanie czasu wyświetlania klatek, co zapewnia płynniejsze odtwarzanie filmów.
  • Obsługa wyjścia wideo HDR o wyższej jakości na urządzeniach, które obsługują tę funkcję.
  • Obsługa bezpiecznego wyjścia podczas odtwarzania treści chronionych przez DRM.
  • Możliwość renderowania treści wideo w pełnej rozdzielczości wyświetlacza na urządzeniach z Androidem TV, które powiększają warstwę interfejsu użytkownika.

Dlatego, jeśli to możliwe, preferuj opcję SurfaceView zamiast TextureView. TextureView należy używać tylko wtedy, gdy SurfaceView nie spełnia Twoich potrzeb. Przykładem jest płynne wyświetlanie animacji lub przewijanie powierzchni wideo w wersjach Androida 7.0 (interfejs API na poziomie 24) i starszych, jak opisano w uwagach poniżej. W tym przypadku zalecamy używanie TextureView tylko wtedy, gdy SDK_INT jest mniejsza niż 24 (Android 7.0), a w przeciwnym razie SurfaceView.

Korzystanie z krzyżałka na Androidzie TV

Pilot Android TV ma panel sterujący, który wysyła polecenia jako zdarzenia klawisza w urządzeniu dispatchKeyEvent(KeyEvent).Activity Te elementy muszą zostać przeniesione do widoku odtwarzacza:

Kotlin

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

Java

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

Żądanie skupienia na widoku odtwarzacza jest ważne dla nawigacji elementów sterujących odtwarzaniem i pomijania reklam. Zastanów się, czy chcesz skoncentrować się na onCreate w ramach Activity:

Kotlin

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

Java

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

Jeśli używasz Compose na Androidzie TV, musisz umożliwić skupienie na elemencie AndroidView i przekazać zdarzenie, przekazując parametr modyfikatora do elementu AndroidView:

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

Zastępowanie rysunków

PlayerView używa PlayerControlView do wyświetlania elementów sterujących odtwarzaniem i paska postępu. Obiekty graficzne używane przez PlayerControlView mogą zostać zastąpione przez obiekty graficzne o tych samych nazwach zdefiniowanych w aplikacji. Aby zobaczyć listę elementów rysowanych kontrolera, które można zastąpić, zajrzyj do dokumentacji PlayerControlView w języku Javadoc.

Dalsze dostosowywanie

Jeśli wymagane jest dostosowanie wykraczające poza opisaną powyżej funkcjonalność, oczekujemy, że deweloperzy aplikacji wdrożą własne komponenty UI zamiast korzystać z tych udostępnianych przez moduł UI Media3.