Medya oynatan bir uygulama, medyayı görüntülemek ve oynatmayı kontrol etmek için kullanıcı arayüzü bileşenleri gerektirir. Media3 kitaplığı, çeşitli kullanıcı arayüzü bileşenleri içeren bir kullanıcı arayüzü modülü içerir. Kullanıcı arayüzü modülüne bağımlı olmak için aşağıdaki bağımlılığı ekleyin:
Kotlin
implementation("androidx.media3:media3-ui:1.3.1")
Modern
implementation "androidx.media3:media3-ui:1.3.1"
En önemli bileşen, medya oynatmalarına yönelik görünüm olan PlayerView
'tir.
PlayerView
, oynatma sırasında videoyu, altyazıları, albüm kapağını ve oynatma kontrollerini gösterir.
PlayerView
, oynatıcı örneklerini eklemek ve ayırmak için (null
atlayarak) setPlayer
yöntemi kullanır.
Oynatıcı Görünümü
PlayerView
hem video hem de ses oynatmaları için kullanılabilir. Video oynatılırken video ve altyazı oluşturur, ayrıca ses dosyalarına meta veri olarak eklenen posterleri gösterebilir. Bunu, diğer tüm kullanıcı arayüzü bileşenleri
gibi düzen dosyalarınıza ekleyebilirsiniz. Örneğin, aşağıdaki XML ile bir PlayerView
eklenebilir:
<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"/>
Yukarıdaki snippet, PlayerView
öğesinin birkaç özellik sağladığını göstermektedir. Bu özellikler, görünümün davranışının yanı sıra görünüm ve tarzını da özelleştirmek için kullanılabilir. Bu özelliklerin çoğunda, çalışma zamanında görünümü özelleştirmek için kullanılabilen karşılık gelen setter yöntemleri bulunur. PlayerView
Javadoc'unda bu özellikler ve ayarlayıcı yöntemleri daha ayrıntılı bir şekilde listelenmektedir.
Görünüm, düzen dosyasında tanımlandıktan sonra etkinliğin onCreate
yönteminde aranabilir:
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); }
Bir oynatıcı başlatıldıktan sonra setPlayer
çağrısı yapılarak görünüme eklenebilir:
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();
Yüzey türü seçin
PlayerView
öğesinin surface_type
özelliği, video oynatma için kullanılan yüzey türünü ayarlamanızı sağlar. spherical_gl_surface_view
(küresel video oynatma için özel bir değerdir) ve video_decoder_gl_surface_view
(uzantı oluşturucuları kullanarak video oluşturma için) değerlerinin yanı sıra, izin verilen değerler surface_view
, texture_view
ve none
'dir. Görüntü yalnızca ses çalma amaçlıysa yüzey oluşturmak zorunda kalmamak için none
kullanılmalıdır. Aksi halde durum pahalı olabilir.
Görüntüleme, normal video oynatma içinse surface_view
veya texture_view
kullanılmalıdır. SurfaceView
, video oynatma için TextureView
ile karşılaştırıldığında bazı avantajlara sahiptir:
- Birçok cihazda önemli ölçüde daha düşük güç tüketimi.
- Daha doğru kare zamanlaması, daha düzgün video oynatması sağlar.
- Uygun cihazlarda daha yüksek kaliteli HDR video çıkışı desteği.
- DRM korumalı içerik oynatıldığında güvenli çıkış desteği.
- Kullanıcı arayüzü katmanını yükselten Android TV cihazlarında ekranın tam çözünürlüğünde video içeriği oluşturma özelliği.
Bu nedenle, mümkün olduğunda TextureView
yerine SurfaceView
tercih edilmelidir.
TextureView
, yalnızca SurfaceView
ihtiyaçlarınızı karşılamıyorsa kullanılmalıdır. Aşağıdaki notlarda açıklandığı gibi, Android 7.0'dan (API düzeyi 24) önce animasyonların düzgün çalışmasının veya video yüzeyinin kaydırılmasının gerekli olduğu durumlar buna örnek olarak verilebilir. Bu durumda, TextureView
özelliğinin yalnızca SDK_INT
24'ten (Android 7.0) küçük olduğunda kullanılması, aksi halde SurfaceView
değerinin kullanılması tercih edilir.
Android TV'de D-pad ile gezinme
Android TV'nin uzaktan kumandasında, Activity
cihazınızın dispatchKeyEvent(KeyEvent)
konumunda önemli etkinlik olarak gelen komutları gönderen bir D-pad kontrolü vardır. Bunların oynatıcı görünümüne yetki verilmesi gerekir:
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); }
Oynatıcı görünümüne odaklanma isteğinde bulunmak, oynatma denetimlerinde gezinmek ve reklamları atlamak için önemlidir. Activity
öğesinin onCreate
tanesinde odak isteğinde bulunabilirsiniz:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView.requestFocus() // ... }
Java
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView.requestFocus(); // ... }
Android TV'de Oluşturma özelliğini kullanıyorsanız AndroidView
öğesini odaklanılabilir hale getirmeniz ve değiştirici parametresini uygun şekilde AndroidView
öğesine ileterek etkinliği yetkilendirmeniz gerekir:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Çekilebilirleri geçersiz kıl
PlayerView
, oynatma denetimlerini ve ilerleme çubuğunu görüntülemek için PlayerControlView
kullanır. PlayerControlView
tarafından kullanılan çekilebilir öğeler, uygulamanızda tanımlı olan aynı adlara sahip çekilebilir öğeler tarafından geçersiz kılınabilir. Geçersiz kılınabilen kontrol çekilebilir öğelerinin listesi için PlayerControlView
Javadoc'unu inceleyin.
Daha fazla özelleştirme
Yukarıda açıklananın ötesinde özelleştirmenin gerekli olduğu durumlarda, uygulama geliştiricilerinin Media3'ün kullanıcı arayüzü modülü tarafından sağlananlar yerine kendi kullanıcı arayüzü bileşenlerini uygulamasını bekleriz.