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. 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.4.1")

Groovy

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.

PlayerView

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, aşağıdaki XML'e bir PlayerView dahil edilebilir:

<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 davranışının yanı sıra görünümünü ve tarzını ö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 ayarlama 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 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ı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 video daha akıcı oynatılır.
  • Uygun özellikli 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 cihazınızın dispatchKeyEvent(KeyEvent) bölümüne ö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 istemek, 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 Oluştur'u kullanıyorsanız AndroidView öğesini odaklanılabilir hale getirmeniz ve değiştirici parametresini AndroidView öğesine uygun şekilde ileterek etkinliği devretmeniz 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. Üzerinden yazılabilen kontrol çizilebilir öğelerinin listesi için PlayerControlView Javadoc'ına 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.