Wiedergabesteuerung zur App hinzufügen

Eine App, die Medien abspielt, benötigt Komponenten der Benutzeroberfläche zum Anzeigen von Medien und Steuern der Wiedergabe. Die Media3-Bibliothek enthält ein UI-Modul, das eine Reihe von UI-Komponenten enthält. Fügen Sie die folgende Abhängigkeit hinzu, um vom UI-Modul abhängig zu sein:

Kotlin

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

Cool

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

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

PlayerView hat eine setPlayer-Methode zum Anhängen und Trennen von Spielerinstanzen durch Übergabe von null.

Player-Ansicht

PlayerView kann sowohl für die Video- als auch für die Audiowiedergabe verwendet werden. Er rendert Videos und Untertitel bei der Videowiedergabe und kann Artwork anzeigen, das als Metadaten in Audiodateien enthalten ist. Sie können sie wie jede andere UI-Komponente in Ihre Layoutdateien einfügen. Beispielsweise kann ein PlayerView in folgendem 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 Snippet oben zeigt, dass PlayerView mehrere Attribute hat. Mit diesen Attributen können Sie das Verhalten und das Design der Ansicht anpassen. Die meisten dieser Attribute haben entsprechende Setter-Methoden, mit denen die Ansicht während der Laufzeit angepasst werden kann. Im Javadoc zu PlayerView werden diese Attribute und Setter-Methoden ausführlicher aufgeführt.

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

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

Wenn ein Player initialisiert wurde, kann er durch Aufrufen von setPlayer an die Ansicht angehängt werden:

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 kannst du die Art der Oberfläche festlegen, die für die Videowiedergabe verwendet wird. Neben den Werten spherical_gl_surface_view (ein spezieller Wert für die sphärische Videowiedergabe) und video_decoder_gl_surface_view (für das Video-Rendering mit Erweiterungs-Renderern) sind die zulässigen Werte surface_view, texture_view und none. Wenn die Ansicht nur für die Audiowiedergabe vorgesehen ist, sollte none verwendet werden, damit keine Oberfläche erstellt werden muss, da dies teuer sein kann.

Wenn der Aufruf für die normale Videowiedergabe vorgesehen ist, sollten Sie surface_view oder texture_view verwenden. SurfaceView bietet gegenüber TextureView eine Reihe von Vorteilen bei der Videowiedergabe:

  • Erheblich geringerer Stromverbrauch auf vielen Geräten.
  • 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 Android TV-Geräten in voller Auflösung des Bildschirms zu rendern, wobei die UI-Ebene angepasst wird.

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

Navigation über das Steuerkreuz bei Android TV

Die Fernbedienung von Android TV hat ein Steuerkreuz, mit dem Befehle gesendet werden, die als Schlüsselereignis an dispatchKeyEvent(KeyEvent) deiner Activity ankommen. Diese müssen an die Spieleransicht delegiert werden:

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

Das Anfordern des Fokus für die Playeransicht ist wichtig, um die Wiedergabesteuerung zu steuern und Anzeigen zu überspringen. Sie können den Fokus in onCreate der Activity anfordern:

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 du Compose auf Android TV verwendest, musst du AndroidView fokussierbar machen und das Ereignis delegieren, indem du den Modifikatorparameter entsprechend in die AndroidView übergibst:

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

Drawables überschreiben

PlayerView verwendet PlayerControlView, um die Wiedergabesteuerung und die Fortschrittsanzeige anzuzeigen. Die von PlayerControlView verwendeten Drawables können von Drawables mit denselben Namen überschrieben werden, die in Ihrer Anwendung definiert sind. Eine Liste der Drawables für Steuerelemente, die überschrieben werden können, findest du in der Javadoc zu PlayerControlView.

Weitere Anpassungsmöglichkeiten

Wenn darüber hinaus Anpassungen erforderlich sind, erwarten wir, dass App-Entwickler ihre eigenen UI-Komponenten implementieren und nicht die über das UI-Modul von Media3 bereitgestellten Komponenten verwenden.