Ses/video için Media3'ü nasıl yapılandırılır ve eski ExoPlayer'dan geçiş yapılır
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ırPlayerView)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:
MediaSessionServicebirExoPlayeroluşturur- Bunun üzerine bir
MediaSessionoluşturulur - Ekran,
MediaControlleraracı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ı:
- Bağımlılıkları değiştirin:
com.google.android.exoplayer2:*yerineandroidx.media3:*kullanın. - Importları ve sınıf adlarını düzeltin:
SimpleExoPlayer→ExoPlayercom.google.android.exoplayer2.MediaItem→androidx.media3.common.MediaItemStyledPlayerView→androidx.media3.ui.PlayerView
- Kararsız API'lerle ilgili uyarılar çıkarsa,
@OptIn(UnstableApi::class)ifadesini noktasal olarak ekleyin (gereksiz yere "tüm projeye" uygulamayın). - 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.playeratanmamış,androidx.media3.uidışından yanlışPlayerViewkullanılmış veyaprepare()ç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ı
MediaSessionServiceyerine 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.