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şenlerini içeren bir kullanıcı arayüzü modülü içerir. UI modülüne bağımlı olmak için aşağıdaki bağımlılığı ekleyin:
Kotlin
implementation("androidx.media3:media3-ui:1.3.1")
Eski
implementation "androidx.media3:media3-ui:1.3.1"
En önemli bileşen, medya oynatmalarına yönelik bir görünüm olan PlayerView
'tir.
PlayerView
, oynatma sırasında video, altyazılar ve albüm kapağının yanı sıra oynatma kontrollerini gösterir.
PlayerView
, oynatıcı örneklerini eklemek ve çıkarmak (null
atlayarak) için bir setPlayer
yöntemine sahiptir.
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 kullanıcı arayüzü bileşenleri gibi
düzen dosyalarınıza ekleyebilirsiniz. Örneğin PlayerView
, aşağıdaki XML ile 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'te PlayerView
öğesinin birkaç özellik sunduğu gösterilmektedir. Bu özellikler, görünümün yanı sıra görünümü ve tarzı özelleştirmek için kullanılabilir. Bu özelliklerin çoğu, çalışma zamanında görünümü özelleştirmek için kullanılabilecek karşılık gelen belirleyici yöntemlerine sahiptir. PlayerView
Javadoc bu özellikleri ve belirleyici yöntemlerini daha ayrıntılı bir şekilde listeler.
Görünüm, düzen dosyasında bildirildikten 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); }
Başlatılan bir oynatıcı, 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ıza olanak tanır. 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çindir) değerlerinin yanı sıra surface_view
, texture_view
ve none
değerlerine de izin verilir. Görüntü yalnızca ses çalma amaçlıysa bunu yapmak pahalı olabileceğinden bir yüzey oluşturmak zorunda kalmamak için none
kullanılmalıdır.
Görüntüleme normal video oynatma içinse surface_view
veya texture_view
kullanılmalıdır. Video oynatma için SurfaceView
, TextureView
ile karşılaştırıldığında çok sayıda avantaj sunar:
- Birçok cihazda önemli ölçüde daha düşük güç tüketimi.
- Daha doğru kare zamanlaması, daha akıcı video oynatma sağlar.
- Uygun olan cihazlarda daha yüksek kaliteli HDR video çıkışı desteği.
- DRM korumalı içerik oynatılırken güvenli çıkış desteği.
- Android TV cihazlarında, kullanıcı arayüzü katmanının ölçeğini artıran video içeriğini ekranın tam çözünürlüğünde oluşturma olanağı.
Dolayısıyla mümkünse TextureView
yerine SurfaceView
tercih edilmelidir.
TextureView
yalnızca SurfaceView
ihtiyaçlarınızı karşılamıyorsa kullanılmalıdır. Örneğin, aşağıdaki notlarda açıklandığı gibi, Android 7.0'dan (API düzeyi 24) önce video yüzeyinin sorunsuz animasyonlarının veya kaydırılmasının gerekli olduğu durumlardır. Bu durumda, TextureView
özelliğinin yalnızca SDK_INT
24'ten (Android 7.0) düşük olduğunda (Android 7.0) ve aksi durumda SurfaceView
kullanılması tercih edilir.
Android TV'de d-pad ile gezinme
Android TV'nin uzaktan kumandasında, Activity
cihazınızın dispatchKeyEvent(KeyEvent)
kadarına önemli etkinlik olarak gelen komutlar gönderen bir D-pad kontrolü bulunur. Bunların oyuncu 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ü için odak isteğinde bulunmak, oynatma kontrollerinde gezinmek ve reklamları atlamak açısından önemlidir. Şu Activity
örneğinden onCreate
içinde odaklanma 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 Compose'u kullanıyorsanız AndroidView
öğesini odaklanılabilir yapmanız ve değiştirici parametresini AndroidView
öğesine uygun şekilde ileterek etkinliğe yetki vermeniz gerekir:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Çekilebilir öğeleri geçersiz kıl
PlayerView
, oynatma kontrollerini ve ilerleme çubuğunu görüntülemek için PlayerControlView
kullanır. PlayerControlView
tarafından kullanılan çekilebilirler, uygulamanızda tanımlanan aynı adlara sahip çekilebilirler tarafından geçersiz kılınabilir. Geçersiz kılınabilecek kontrol çekilebilirlerinin listesi için PlayerControlView
Javadoc belgesine bakın.
Daha fazla özelleştirme
Yukarıda açıklananların ötesinde özelleştirmenin gerekli olduğu durumlarda, uygulama geliştiricilerin Media3'ün kullanıcı arayüzü modülü tarafından sağlananlar yerine kendi kullanıcı arayüzü bileşenlerini uygulamasını bekleriz.