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.1")
Cool
implementation "androidx.media3:media3-ui:1.4.1"
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 besonderer 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 weniger Energie 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) oder 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
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
von Drawables mit denselben Namen überschrieben werden, die in deiner Anwendung definiert sind. Weitere Informationen finden Sie unter
Das Javadoc zu PlayerControlView
enthält eine Liste der Drawable-Steuerungen, die
ü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.