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.4.1")
Eski
implementation "androidx.media3:media3-ui:1.4.1"
En önemli bileşen, medya oynatmalarına yönelik bir görünüm olan PlayerView
'dir.
PlayerView
, oynatma sırasında video, resim, altyazı ve albüm kapağının yanı sıra oynatma kontrollerini gösterir.
PlayerView
, oynatıcı örneklerini eklemek ve kaldırmak (null
ile) için setPlayer
yöntemine sahiptir.
Oynatıcı Görünümü
PlayerView
hem video, resim hem de ses oynatmaları için kullanılabilir. Video oynatma durumunda video ve altyazı, resim oynatma durumunda bitmap oluşturur ve ses dosyalarına meta veri olarak eklenen posterleri görüntüleyebilir. 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
'ün çeşitli özellikler sağladığı 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'da bu özellikler ve ayarlayıcı yöntemleri daha ayrıntılı olarak listelenir.
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üzeyin 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şturma araçları kullanılarak video oluşturma içindir) değerlerinin yanı sıra izin verilen değerler surface_view
, texture_view
ve none
'dir. Görüntüleme yalnızca ses oynatma içinse pahalı olabileceğinden bir yüzey oluşturma zorunluluğunu önlemek için none
kullanılmalıdır.
Görünüm normal video oynatma içinse surface_view
veya texture_view
kullanılmalıdır. SurfaceView
, video oynatma için TextureView
'e kıyasla birçok avantaja sahiptir:
- Birçok cihazda düşük güç tüketimi
- Daha doğru kare zamanlaması sayesinde daha akıcı video oynatma.
- Uygun olan cihazlarda daha yüksek kaliteli HDR video çıkışı desteği.
- DRM korumalı içerik oynatırken güvenli çıkış desteği.
- Kullanıcı arayüzü katmanını ölçeklendiren Android TV cihazlarda video içeriğini ekranın tam çözünürlüğünde oluşturma olanağı.
Bu nedenle, mümkün olduğunda SurfaceView
yerine TextureView
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 (API düzeyi 24) öncesinde video yüzeyinin sorunsuz animasyonlarla veya kaydırmayla gösterilmesi gerekir. Bu durumda, yalnızca SDK_INT
24'ten azsa (Android 7.0) TextureView
, aksi takdirde SurfaceView
kullanılması tercih edilir.
Android TV'de D-pad gezinme
Android TV'nin uzaktan kumandasında, Activity
'nizin dispatchKeyEvent(KeyEvent)
bölümünde önemli etkinlik olarak gelen komutları gönderen bir D-pad kontrolü bulunur. Aşağıdakilerin oynatıcı görünümüne atanması 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 odaklanma isteğinde bulunmak, oynatma kontrollerinde gezinmek ve reklamları atlamak için önemlidir. Activity
'teki onCreate
alanında odaklanmayı isteyebilirsiniz:
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 }
)
Çizilebilir öğeleri geçersiz kılma
PlayerView
, oynatma kontrollerini ve ilerleme çubuğunu görüntülemek için PlayerControlView
kullanır. PlayerControlView
tarafından kullanılan çizilebilir öğeler, uygulamanızda tanımlanan aynı ada sahip çizilebilir öğeler 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çıklananın ötesinde özelleştirme gerektiğinde, uygulama geliştiricilerin Media3'ün kullanıcı arayüzü modülü tarafından sağlananları kullanmak yerine kendi kullanıcı arayüzü bileşenlerini uygulamasını bekliyoruz.