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.