Dodaj elementy sterujące odtwarzaniem w aplikacji

Aplikacja odtwarza multimedia do wyświetlania multimediów i sterowania odtwarzaniem. Biblioteka Media3 zawiera moduł interfejsu, który składa się z różnych komponentów interfejsu. Aby zależeć od modułu interfejsu, dodaj tę zależność:

Kotlin

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

Odlotowe

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

Najważniejszym elementem jest PlayerView, czyli widok do odtwarzania multimediów. PlayerView wyświetla filmy, napisy i okładki albumów podczas odtwarzania oraz elementy sterujące odtwarzaniem.

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

Widok odtwarzacza

Typu PlayerView można używać zarówno do odtwarzania dźwięku, jak i wideo. W przypadku odtwarzania filmu renderuje film i napisy, a w plikach audio może wyświetlać grafikę wraz z metadanymi. Możesz go umieścić w plikach układu jak każdy inny komponent interfejsu. PlayerView może być np. zawarty w tym kodzie 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"/>

Ten fragment kodu pokazuje, że PlayerView ma kilka atrybutów. Za pomocą tych atrybutów możesz dostosować działanie widoku, a także jego wygląd i styl. Większość z tych atrybutów ma odpowiednie metody ustawiania, których można używać do dostosowywania widoku w czasie działania. Szczegółowe informacje o tych atrybutach i metodach ustawienia znajduje się w PlayerView Javadoc.

Po zadeklarowaniu widoku w pliku szablonu można go wyszukać w metodzie 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 dołączyć go do widoku, wywołując polecenie 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();

Wybierz typ nawierzchni

Atrybut surface_type właściwości PlayerView pozwala określić typ platformy używanej do odtwarzania filmów. Oprócz wartości spherical_gl_surface_view (która jest specjalną wartością przy odtwarzaniu filmu sferycznego) i video_decoder_gl_surface_view (do renderowania wideo za pomocą mechanizmów renderowania rozszerzeń) dozwolone wartości to surface_view, texture_view i none. Jeśli widok jest przeznaczony tylko do odtwarzania dźwięku, należy użyć elementu none, aby uniknąć tworzenia platformy, ponieważ może to być kosztowne.

Jeśli widok służy do zwykłego odtwarzania filmów, użyj właściwości surface_view lub texture_view. SurfaceView ma wiele zalet w porównaniu z TextureView pod względem odtwarzania filmów:

  • Znacznie mniejsze zużycie energii na wielu urządzeniach.
  • Bardziej dokładny czas wczytywania klatek, co przekłada się na płynniejsze odtwarzanie filmu.
  • Obsługa lepszej jakości wyjścia wideo HDR na urządzeniach obsługujących tę funkcję.
  • Obsługa bezpiecznych plików wyjściowych podczas odtwarzania treści chronionych mechanizmem DRM.
  • Możliwość renderowania treści wideo w pełnej rozdzielczości wyświetlacza na urządzeniach z Androidem TV, które ulepszają warstwę interfejsu.

Dlatego tam, gdzie to możliwe, opcja SurfaceView powinna być lepsza niż TextureView. Typu TextureView należy używać tylko wtedy, gdy interfejs SurfaceView nie spełnia Twoich wymagań. Jednym z przykładów jest konieczność zapewnienia płynnych animacji lub przewijania powierzchni wideo w wersjach Androida 7.0 (poziom interfejsu API 24) zgodnie z dalszymi uwagami. W tym przypadku zalecamy używanie TextureView tylko wtedy, gdy wartość SDK_INT jest mniejsza niż 24 (Android 7.0), a SurfaceView w innym przypadku.

Nawigacja za pomocą pada kierunkowego na Androidzie TV

Pilot do Androida TV jest wyposażony w pad kierunkowy, który wysyła polecenia, które pojawiają się jako kluczowe zdarzenie na urządzeniu dispatchKeyEvent(KeyEvent) na urządzeniu Activity. Te elementy musisz przekazać 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);
}

Zaznaczenie widoku odtwarzacza jest ważne, ponieważ pozwala poruszać się po elementach sterujących odtwarzaniem i pomijać reklamy. Zastanów się nad zwróceniem uwagi na onCreate z tych elementów (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 funkcji Utwórz na Androidzie TV, musisz ustawić możliwość zaznaczenia pola AndroidView i przekazać zdarzenie, przekazując parametr modyfikujący do parametru AndroidView:

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

Zastępuj elementy, które można przeciągać

Do wyświetlania elementów sterujących odtwarzaniem i paska postępu PlayerView używa przeglądarki PlayerControlView. Elementy rysowane używane przez PlayerControlView można zastępować przez elementy rysowane o tych samych nazwach zdefiniowanych w aplikacji. Listę elementów sterujących, które można zastąpić, znajdziesz w dokumentacji Java PlayerControlView.

Dalsze dostosowywanie

Jeśli wymagane jest dostosowanie w większym zakresie, oczekujemy, że deweloperzy aplikacji wdrożą własne komponenty interfejsu, a nie te pochodzące z modułu interfejsu Media3.