Ses/video için Media3'ü nasıl yapılandırılır ve eski ExoPlayer'dan geçiş yapılır

Kerem Aydın·7 Temmuz 2026·⏱3 dk

ExoPlayer'ı "başka bir şeyle" değiştirmeye genellikle gerek yoktur: ExoPlayer, Jetpack'in bir parçası haline geldi ve AndroidX Media3 üzerinden kullanılıyor. Pratikte bu, bağımlılıkların ve importların (com.google.android.exoplayer2 → androidx.media3.*) değiştirilmesi ve arka planda oynatma için daha doğru bir şema uygulanması anlamına gelir.

İçindekiler

AndroidX Media3 nedir ve ExoPlayer'ı değiştirmek için neden daha iyidir

AndroidX Media3, medya oynatma ve yönetimi için kütüphane setidir. İçinde ExoPlayer tabanlı bir Player uygulamasının yanı sıra kullanıcı arayüzü ve sistem entegrasyonu (bildirim çubuğu, kulaklık, araçlar, kilit ekranı) için modüller bulunur.

"ExoPlayer'ı değiştirmek" denildiğinde, %99 oranında şu geçiş kastedilir:

  • androidx.media3:media3-exoplayer (motor)
  • androidx.media3:media3-ui (hazır PlayerView)
  • androidx.media3:media3-session (arka plan, sistem kontrolleri)

Hızlı başlangıç: bağımlılıklar, PlayerView ve oynatmayı başlatma

Modülleri ekleyin (merkezi olarak güncellemek için sürümü tek bir değişkende tutun):

dependencies {
    implementation "androidx.media3:media3-exoplayer:$media3Version"
    implementation "androidx.media3:media3-ui:$media3Version"
}

Düzen:

<androidx.media3.ui.PlayerView
    android:id="@+id/playerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:show_buffering="when_playing" />

Video/ses için minimum Kotlin kodu:

private var player: ExoPlayer? = null

override fun onStart() {
    super.onStart()
    player = ExoPlayer.Builder(this).build().also { exo ->
        findViewById<PlayerView>(R.id.playerView).player = exo
        exo.setMediaItem(MediaItem.fromUri(mediaUrl))
        exo.prepare()
        exo.playWhenReady = true
    }
}

override fun onStop() {
    super.onStop()
    findViewById<PlayerView>(R.id.playerView).player = null
    player?.release()
    player = null
}

Bu video içermeyen bir ses ise, PlayerView zorunlu değildir: ExoPlayer'ı doğrudan yönetebilir ve kendi kullanıcı arayüzünüzü (düğmeler/zamanlayıcı/ilerleme çubuğu) gösterebilirsiniz.

Arka planda oynatma: MediaSessionService ve sistem düğmeleri

Arka planda oynatma gerekiyorsa (bildirim çubuğu, kilit ekranı, kulaklık düğmeleri), oynatıcıyı yalnızca Activity içinde tutmak yeterli değildir. Media3'teki tipik şema şöyledir:

  1. MediaSessionService bir ExoPlayer oluşturur
  2. Bunun üzerine bir MediaSession oluşturulur
  3. Ekran, MediaController aracılığıyla kontrol sağlar (oturuma bağlanır)

Modülü ekleyin:

implementation "androidx.media3:media3-session:$media3Version"

Sık yapılan bir hata, arka planı tek bir Activity üzerinden "zorlamaya" çalışmak ve oynatma sırasında hizmeti ön plana çıkarmamaktır. Sonuç olarak ses kesilir ve sistemde kontroller ya yoktur ya da kararsızdır.

Sorumluluklar için minimum kılavuz:

  • Service: Kullanıcı arayüzünden daha uzun ömürlüdür, oynatıcıyı/kuyruğu/durumu tutar
  • UI: Ekranı gösterir ve komutları gönderir (oynat/duraklat/ileri-geri/sonraki)

Eski ExoPlayer'dan geçiş: en sık neler bozulur

Acısız geçiş planı:

  1. Bağımlılıkları değiştirin: com.google.android.exoplayer2:* yerine androidx.media3:* kullanın.
  2. Importları ve sınıf adlarını düzeltin:
    • SimpleExoPlayer → ExoPlayer
    • com.google.android.exoplayer2.MediaItem → androidx.media3.common.MediaItem
    • StyledPlayerView → androidx.media3.ui.PlayerView
  3. Kararsız API'lerle ilgili uyarılar çıkarsa, @OptIn(UnstableApi::class) ifadesini noktasal olarak ekleyin (gereksiz yere "tüm projeye" uygulamayın).
  4. Arka planı ve sistem kontrollerini MediaSessionService üzerine taşıyın (daha önce eski bağlantıları ve bildirim yöneticilerini kullanıyorsanız).

Sık yapılan hatalar

  • Videoda siyah ekran: playerView.player atanmamış, androidx.media3.ui dışından yanlış PlayerView kullanılmış veya prepare() çağrılmamış.
  • Bellek sızıntıları/çift ses: release() çağrılmıyor ve her döndürme/ekrana dönüşte yeni bir oynatıcı oluşturuluyor.
  • Arka planda her şey "ölüyor": Oynatıcı MediaSessionService yerine kullanıcı arayüzünde yaşıyor, oynatma sırasında ön plana doğru geçiş yok.
  • Geçiştan sonra "sınıf bulunamadı": Bu normaldir — paketler taşındı, importları ve UI bileşenlerini güncellemeniz gerekir.

SSS

ExoPlayer eskidi mi?
Eski yapıtlar ve com.google.android.exoplayer2 paketleri eskidi. ExoPlayer kendisi Media3 içinde gelişmeye devam ediyor.

Eski ExoPlayer'ı bırakıp geçiş yapmamak mümkün mü?
Mümkün, ancak projeyi eski bağımlılıklara sabitlemiş olursunuz: düzeltmeleri, yeni özellikleri ve modern Android gereksinimleriyle uyumluluğu almak daha zor olur.

"Sadece mp3/mp4 oynatmak" istiyorsam ne yapmalıyım?
media3-exoplayer (+ gerekirse media3-ui) ekleyin ve yukarıdaki minimum örneği kullanın. Arka plan desteğini yalnızca gerçekten gerekiyorsa ekleyin.