Uygulamanıza oynatma kontrolleri ekleme

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.