Wiedergabesteuerung zur App hinzufügen

Eine App, in der Medien wiedergegeben werden, benötigt Benutzeroberflächenkomponenten zum Anzeigen von Medien und zum Steuern der Wiedergabe. Die Media3-Bibliothek enthält ein UI-Modul mit einer Reihe von UI-Komponenten. Wenn Sie vom UI-Modul abhängig sein möchten, fügen Sie die folgende Abhängigkeit hinzu:

Kotlin

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

Cool

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

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

PlayerView hat eine setPlayer-Methode zum Anhängen und Trennen von Playerinstanzen (durch Übergeben von null).

PlayerView

PlayerView kann sowohl für die Video-, Bild- als auch die Audiowiedergabe verwendet werden. Bei der Videowiedergabe werden Video und Untertitel gerendert, bei der Bildwiedergabe Bitmaps und es kann Artwork angezeigt werden, das als Metadaten in Audiodateien enthalten ist. Sie können sie wie jede andere UI-Komponente in Ihre Layoutdateien einfügen. Ein PlayerView kann beispielsweise in das folgende XML-Element eingefügt werden:

<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 bietet. Mit diesen Attributen können Sie das Verhalten und das Design der Ansicht anpassen. Die meisten dieser Attribute haben entsprechende Setzermethoden, mit denen sich die Ansicht zur Laufzeit anpassen lässt. In der Javadoc-Datei für PlayerView werden diese Attribute und Setzermethoden ausführlicher beschrieben.

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

Nachdem ein Player initialisiert wurde, kann er der Ansicht durch Aufrufen von setPlayer hinzugefügt 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 surface_type-Attribut von PlayerView können Sie 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 gedacht ist, sollte none verwendet werden, um das Erstellen einer Oberfläche zu vermeiden, 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 im Vergleich zu TextureView einige Vorteile bei der Videowiedergabe:

  • Deutlich geringerer Stromverbrauch auf vielen Geräten.
  • Genaueres Frame-Timing für eine flüssigere Videowiedergabe
  • Unterstützung für eine höhere Qualität der HDR-Videoausgabe auf kompatiblen Geräten.
  • Unterstützung für sichere Ausgabe bei der Wiedergabe von DRM-geschützten Inhalten
  • Die Möglichkeit, Videoinhalte in der vollen Auflösung des Displays auf Android TV-Geräten zu rendern, die die UI-Ebene hochskalieren.

SurfaceView sollte daher nach Möglichkeit TextureView vorgezogen 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 sollten Sie TextureView nur verwenden, wenn SDK_INT kleiner als 24 (Android 7.0) ist, 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 Playeransicht 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 Wiedergabeansicht ist wichtig, um die Wiedergabesteuerung zu bedienen 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 in 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

In PlayerView werden die Wiedergabesteuerung und der Fortschrittsbalken mit PlayerControlView angezeigt. Die von PlayerControlView verwendeten Drawables können durch Drawables mit denselben Namen überschrieben werden, die in Ihrer Anwendung definiert sind. Eine Liste der Drawables für Steuerelemente, die überschrieben werden können, finden Sie in der Javadoc für PlayerControlView.

Weitere Anpassungen

Wenn eine darüber hinausgehende Anpassung erforderlich ist, gehen wir davon aus, dass App-Entwickler ihre eigenen UI-Komponenten implementieren, anstatt die vom UI-Modul von Media3 bereitgestellten zu verwenden.