Wiedergabesteuerung zur App hinzufügen

Für die Wiedergabe von Medien in einer App sind Komponenten der Benutzeroberfläche zur Anzeige von Medien und zur Steuerung der Wiedergabe erforderlich. Die Media3-Bibliothek enthält ein UI-Modul mit einer Reihe von UI-Komponenten. 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")

Groovig

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

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

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

Player-Ansicht

PlayerView kann sowohl für die Video- als auch für die Audiowiedergabe verwendet werden. Sie rendert Videos und Untertitel im Fall der Videowiedergabe und kann Artwork in Audiodateien als Metadaten anzeigen. Sie können sie wie jede andere UI-Komponente in Ihre Layoutdateien einbinden. Ein PlayerView kann beispielsweise 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 bereitstellt. Mit diesen Attributen können Sie das Verhalten sowie das Erscheinungsbild der Ansicht anpassen. Die meisten dieser Attribute haben entsprechende Setter-Methoden, mit denen die Ansicht zur Laufzeit angepasst werden kann. In PlayerView-Javadoc werden diese Attribute und Setter-Methoden ausführlicher aufgeführt.

Nachdem die Ansicht in der Layoutdatei deklariert wurde, kann sie in der Methode onCreate der Aktivität nachgeschlagen 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 mit der Ansicht verknüpft 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 für die Videowiedergabe festlegen. 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 die Ansicht für die normale Videowiedergabe vorgesehen ist, sollte surface_view oder texture_view verwendet werden. SurfaceView hat gegenüber TextureView mehrere Vorteile bei der Videowiedergabe:

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

SurfaceView sollte daher nach Möglichkeit gegenüber TextureView bevorzugt werden. TextureView sollte nur verwendet werden, wenn SurfaceView nicht Ihren Anforderungen entspricht. Vor Android 7.0 (API-Ebene 24) sind z. B. sanfte Animationen oder sanftes Scrollen der Videooberfläche erforderlich, wie in den folgenden Hinweisen beschrieben. In diesem Fall empfiehlt es sich, TextureView nur dann zu verwenden, wenn SDK_INT kleiner als 24 (Android 7.0) ist, andernfalls SurfaceView.

Navigation über das Steuerkreuz unter Android TV

Die Fernbedienung von Android TV hat ein Steuerkreuz, über das Befehle als Schlüsselereignis bei dispatchKeyEvent(KeyEvent) deines Activity gesendet werden. 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 Playeransicht ist wichtig, um die Wiedergabesteuerung zu navigieren und Anzeigen zu überspringen. Sie können den Fokus in onCreate von 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 Sie Compose unter Android TV verwenden, müssen Sie AndroidView fokussierbar machen und das Ereignis delegieren. Dazu übergeben Sie den Modifikatorparameter entsprechend an AndroidView:

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

Drawables überschreiben

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

Weitere Anpassung

Wenn eine Anpassung über die oben beschriebene hinaus erforderlich ist, gehen wir davon aus, dass App-Entwickler ihre eigenen UI-Komponenten implementieren und nicht die vom UI-Modul von Media3 bereitgestellten verwenden.