Aplikacja odtwarza multimedia do wyświetlania multimediów i sterowania odtwarzaniem. Biblioteka Media3 zawiera moduł interfejsu, który składa się z różnych komponentów interfejsu. Aby zależeć od modułu interfejsu, dodaj tę zależność:
Kotlin
implementation("androidx.media3:media3-ui:1.3.1")
Odlotowe
implementation "androidx.media3:media3-ui:1.3.1"
Najważniejszym elementem jest PlayerView
, czyli widok do odtwarzania multimediów.
PlayerView
wyświetla filmy, napisy i okładki albumów podczas odtwarzania oraz elementy sterujące odtwarzaniem.
PlayerView
udostępnia metodę setPlayer
do podłączania i odłączania (przez przekazywanie null
) instancji odtwarzacza.
Widok odtwarzacza
Typu PlayerView
można używać zarówno do odtwarzania dźwięku, jak i wideo. W przypadku odtwarzania filmu renderuje film i napisy, a w plikach audio może wyświetlać grafikę wraz z metadanymi. Możesz go umieścić w plikach układu
jak każdy inny komponent interfejsu. PlayerView
może być np. zawarty w tym kodzie XML:
<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"/>
Ten fragment kodu pokazuje, że PlayerView
ma kilka atrybutów. Za pomocą tych atrybutów możesz dostosować działanie widoku, a także jego wygląd i styl. Większość z tych atrybutów ma odpowiednie metody ustawiania, których można używać do dostosowywania widoku w czasie działania. Szczegółowe informacje o tych atrybutach i metodach ustawienia znajduje się w PlayerView
Javadoc.
Po zadeklarowaniu widoku w pliku szablonu można go wyszukać w metodzie onCreate
aktywności:
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); }
Po zainicjowaniu odtwarzacza można dołączyć go do widoku, wywołując polecenie 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();
Wybierz typ nawierzchni
Atrybut surface_type
właściwości PlayerView
pozwala określić typ platformy używanej do odtwarzania filmów. Oprócz wartości spherical_gl_surface_view
(która jest specjalną wartością przy odtwarzaniu filmu sferycznego) i video_decoder_gl_surface_view
(do renderowania wideo za pomocą mechanizmów renderowania rozszerzeń) dozwolone wartości to surface_view
, texture_view
i none
. Jeśli widok jest przeznaczony tylko do odtwarzania dźwięku, należy użyć elementu none
, aby uniknąć tworzenia platformy, ponieważ może to być kosztowne.
Jeśli widok służy do zwykłego odtwarzania filmów, użyj właściwości surface_view
lub texture_view
. SurfaceView
ma wiele zalet w porównaniu z TextureView
pod względem odtwarzania filmów:
- Znacznie mniejsze zużycie energii na wielu urządzeniach.
- Bardziej dokładny czas wczytywania klatek, co przekłada się na płynniejsze odtwarzanie filmu.
- Obsługa lepszej jakości wyjścia wideo HDR na urządzeniach obsługujących tę funkcję.
- Obsługa bezpiecznych plików wyjściowych podczas odtwarzania treści chronionych mechanizmem DRM.
- Możliwość renderowania treści wideo w pełnej rozdzielczości wyświetlacza na urządzeniach z Androidem TV, które ulepszają warstwę interfejsu.
Dlatego tam, gdzie to możliwe, opcja SurfaceView
powinna być lepsza niż TextureView
.
Typu TextureView
należy używać tylko wtedy, gdy interfejs SurfaceView
nie spełnia Twoich wymagań. Jednym z przykładów jest konieczność zapewnienia płynnych animacji lub przewijania powierzchni wideo w wersjach Androida 7.0 (poziom interfejsu API 24) zgodnie z dalszymi uwagami. W tym przypadku zalecamy używanie TextureView
tylko wtedy, gdy wartość SDK_INT
jest mniejsza niż 24 (Android 7.0), a SurfaceView
w innym przypadku.
Nawigacja za pomocą pada kierunkowego na Androidzie TV
Pilot do Androida TV jest wyposażony w pad kierunkowy, który wysyła polecenia, które pojawiają się jako kluczowe zdarzenie na urządzeniu dispatchKeyEvent(KeyEvent)
na urządzeniu Activity
. Te elementy musisz przekazać do widoku odtwarzacza:
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); }
Zaznaczenie widoku odtwarzacza jest ważne, ponieważ pozwala poruszać się po elementach sterujących odtwarzaniem i pomijać reklamy. Zastanów się nad zwróceniem uwagi na onCreate
z tych elementów (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(); // ... }
Jeśli używasz funkcji Utwórz na Androidzie TV, musisz ustawić możliwość zaznaczenia pola AndroidView
i przekazać zdarzenie, przekazując parametr modyfikujący do parametru AndroidView
:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Zastępuj elementy, które można przeciągać
Do wyświetlania elementów sterujących odtwarzaniem i paska postępu PlayerView
używa przeglądarki PlayerControlView
. Elementy rysowane używane przez PlayerControlView
można zastępować przez elementy rysowane o tych samych nazwach zdefiniowanych w aplikacji. Listę elementów sterujących, które można zastąpić, znajdziesz w dokumentacji Java PlayerControlView
.
Dalsze dostosowywanie
Jeśli wymagane jest dostosowanie w większym zakresie, oczekujemy, że deweloperzy aplikacji wdrożą własne komponenty interfejsu, a nie te pochodzące z modułu interfejsu Media3.