Wiedergabesteuerung zur App hinzufügen

Eine App, die Medien abspielt, benötigt Benutzeroberflächenkomponenten für die Anzeige von Medien und die Wiedergabe zu steuern. Die Media3-Bibliothek enthält ein UI-Modul mit UI-Komponenten ausgeführt werden. Fügen Sie Folgendes hinzu, um sich vom UI-Modul abhängig zu machen: Abhängigkeit:

Kotlin

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

Cool

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

Die wichtigste Komponente ist PlayerView, eine Ansicht für die Medienwiedergabe. PlayerView zeigt Videos, Bilder, Untertitel und Albumcover während der Wiedergabe an. sowie die Wiedergabesteuerung.

PlayerView hat eine setPlayer-Methode zum Anhängen und Trennen (durch über null) Spielerinstanzen.

Player-Ansicht

PlayerView kann für die Video-, Bild- und Audiowiedergabe verwendet werden. Sie rendert Video und Untertitel bei Videowiedergabe, Bitmaps für die Bildwiedergabe und Grafiken anzeigen, die als Metadaten in Audiodateien enthalten sind. Sie können sie wie bei jeder anderen UI-Komponente auch. Beispiel: PlayerView kann im folgenden XML-Code enthalten sein:

<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"/>

Das obige Snippet zeigt, dass PlayerView mehrere Attribute. Diese Attribute können verwendet werden, um das Verhalten der Ansicht anzupassen: sowie das Design. Die meisten dieser Attribute haben einen entsprechenden Setter , mit denen die Ansicht zur Laufzeit angepasst werden kann. Die PlayerView Javadoc listet diese Attribute und Setter-Methoden in um weitere Details zu erfahren.

Nachdem die Ansicht in der Layoutdatei deklariert wurde, kann sie in der onCreate-Methode der Aktivität:

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);
}

Wurde ein Player initialisiert, kann er durch den Aufruf von 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();

Oberflächentyp auswählen

Mit dem Attribut surface_type von PlayerView können Sie die Art der Oberfläche festlegen. für die Videowiedergabe verwendet wird. Neben den Werten spherical_gl_surface_view (die ist ein spezieller Wert für die sphärische Videowiedergabe) und video_decoder_gl_surface_view (für das Video-Rendering mit Erweiterung) Renderer) sind die zulässigen Werte surface_view, texture_view und none. Wenn die Ansicht nur für die Audiowiedergabe bestimmt ist, sollte none verwendet werden, denn das kann teuer werden.

Wenn der Aufruf eine normale Videowiedergabe ist, dann surface_view oder texture_view verwendet werden sollte. SurfaceView bietet gegenüber TextureView eine Reihe von Vorteilen für Videowiedergabe:

  • Deutlich geringerer Stromverbrauch auf vielen Geräte.
  • Genaueres Frame-Timing für eine flüssigere Videowiedergabe
  • Unterstützung für eine höhere HDR-Videoausgabe auf kompatiblen Geräten.
  • Unterstützung einer sicheren Ausgabe bei der Wiedergabe von DRM-geschützten Inhalten
  • Die Möglichkeit, Videoinhalte auf Geräten mit voller Auflösung zu rendern, Android TV-Geräte, die die UI-Ebene upgraden

Daher sollte nach Möglichkeit SurfaceView gegenüber TextureView bevorzugt werden. TextureView sollte nur verwendet werden, wenn SurfaceView Ihre Anforderungen nicht erfüllt. Eins Beispiel: flüssige Animationen oder Scrollen auf der Videooberfläche sind erforderlich. vor Android 7.0 (API-Level 24), wie in den folgenden Hinweisen beschrieben. Für In diesem Fall wird empfohlen, TextureView nur dann zu verwenden, wenn SDK_INT kleiner ist als als 24 (Android 7.0) bzw. SurfaceView.

Navigation über das Steuerkreuz bei Android TV

Die Fernbedienung von Android TV verfügt über ein Steuerkreuz, kommen als Schlüsselereignis zu dispatchKeyEvent(KeyEvent) Ihrer Activity an. Diese an die Player-Ansicht delegiert werden müssen:

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);
}

Für die Wiedergabe ist es wichtig, den Fokus für die Playeransicht anzufordern und das Überspringen von Anzeigen. Sie können den Schwerpunkt in onCreate der 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();
    // ...
}

Wenn Sie die Funktion „Verfassen“ in Android TV verwenden, müssen Sie die AndroidView fokussierbar und delegieren, indem Sie den Modifikatorparameter an die AndroidView entsprechend:

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

Drawables überschreiben

PlayerView verwendet PlayerControlView, um die Wiedergabe anzuzeigen und die Fortschrittsanzeige. Die von PlayerControlView verwendeten Drawables durch Drawables mit denselben Namen überschrieben werden, die in deiner Anwendung definiert sind. Weitere Informationen finden Sie unter das PlayerControlView-Javadoc. Dort findest du eine Liste der Drawables, überschrieben werden kann.

Weitere Anpassungsmöglichkeiten

Wenn weitere Anpassungen erforderlich sind, erwarten wir, dass die App Entwickler ihre eigenen UI-Komponenten implementieren, anstatt die bereitgestellten über das UI-Modul von Media3.