Şu anda bağımsız com.google.android.exoplayer2
kitaplığını ve androidx.media
'ı kullanan uygulamalar androidx.media3
'e taşınmalıdır. Gradle derleme dosyalarını, Java ve Kotlin kaynak dosyalarını ve XML düzen dosyalarını ExoPlayer 2.19.1
'dan AndroidX Media3 1.1.1
'e taşımak için taşıma komut dosyasını kullanın.
Genel Bakış
Taşıma işlemini gerçekleştirmeden önce yeni API'lerin avantajları, taşınacak API'ler ve uygulamanızın projesinin karşılaması gereken ön koşullar hakkında daha fazla bilgi edinmek için aşağıdaki bölümleri inceleyin.
Neden Jetpack Media3'e geçmelisiniz?
com.google.android.exoplayer2
kullanımdan kaldırılırken ExoPlayer'ın yeni evi budur.MediaBrowser
/MediaController
ile bileşenler/işlemler genelinde Player API'ye erişin.MediaSession
veMediaController
API'nin genişletilmiş özelliklerini kullanın.- Ayrıntılı erişim denetimi ile oynatma özelliklerinin reklamını yapın.
MediaSessionConnector
vePlayerNotificationManager
'i kaldırarak uygulamanızı basitleştirin.- Medya uyumlu istemci API'leriyle geriye dönük uyumludur (
MediaBrowserCompat
/MediaControllerCompat
/MediaMetadataCompat
)
AndroidX Media3'e taşınacak medya API'leri
- ExoPlayer ve uzantıları
Desteği sonlandırılan mediasession modülü hariç olmak üzere eski ExoPlayer projesinin tüm modülleri bu kapsamdadır.com.google.android.exoplayer2
içindeki paketlere bağlı uygulamalar veya modüller, taşıma komut dosyasıyla taşınabilir. - MediaSessionConnector (
androidx.media:media:1.4.3+
'inandroidx.media.*
paketlerine bağlı olarak)
MediaSessionConnector
öğesini kaldırın ve bunun yerineandroidx.media3.session.MediaSession
öğesini kullanın. - MediaBrowserServiceCompat (
androidx.media:media:1.4.3+
'inandroidx.media.*
paketlerine bağlı olarak)androidx.media.MediaBrowserServiceCompat
alt sınıflarınıandroidx.media3.session.MediaLibraryService
'ye,MediaBrowserCompat.MediaItem
kullanan kodu iseandroidx.media3.common.MediaItem
'e taşıyın. - MediaBrowserCompat (
androidx.media:media:1.4.3+
'inandroid.support.v4.media.*
paketlerine bağlı olarak)androidx.media3.common.MediaItem
ileandroidx.media3.session.MediaBrowser
'ı kullanmak içinMediaBrowserCompat
'i veyaMediaControllerCompat
'i kullanarak istemci kodunu taşıyın.
Ön koşullar
Projenizin kaynak kontrolünde olduğundan emin olun
Komut dosyası içeren taşıma araçları tarafından uygulanan değişiklikleri kolayca geri alabileceğinizden emin olun. Projeniz henüz kaynak denetimi altında değilse şimdi başlamanın tam zamanı. Herhangi bir nedenle bunu yapmak istemiyorsanız taşıma işlemine başlamadan önce projenizin yedek kopyasını oluşturun.
Uygulamanızı güncelleme
Projenizi ExoPlayer kitaplığının en son sürümünü kullanacak şekilde güncellemenizi ve desteği sonlandırılan yöntemlerin çağrılarını kaldırmanızı öneririz. Taşıma işlemi için komut dosyasını kullanmak istiyorsanız güncellediğiniz sürümü, komut dosyası tarafından yönetilen sürümle eşleştirmeniz gerekir.
Uygulamanızın compileSdkVersion değerini en az 32 olarak artırın.
Gradle ve Android Studio Gradle eklentisini, yukarıdaki güncellenmiş bağımlılıklarla çalışan en son sürüme yükseltin. Örneğin:
- Android Gradle eklentisi sürümü: 7.1.0
- Gradle sürümü: 7.4
Yıldız (*) kullanan tüm joker karakterli içe aktarma ifadelerini değiştirin ve tam nitelikli içe aktarma ifadelerini kullanın: Joker karakterli içe aktarma ifadelerini silin ve tam nitelikli ifadeleri içe aktarmak için Android Studio'yu kullanın (F2 - Alt/Enter, F2 - Alt/Enter, ...).
com.google.android.exoplayer2.PlayerView
'tencom.google.android.exoplayer2.StyledPlayerView
'e veri taşıma AndroidX Media3'tecom.google.android.exoplayer2.PlayerView
'e eşdeğer bir değer olmadığı için bu gereklidir.
Komut dosyası desteğiyle ExoPlayer'ı taşıma
Komut dosyası, com.google.android.exoplayer2
'ten androidx.media3
altındaki yeni paket ve modül yapısına geçişi kolaylaştırır. Komut dosyası, projenizde bazı doğrulama kontrolleri uygular ve doğrulama başarısız olursa uyarılar yazdırır.
Aksi takdirde, Java veya Kotlin'de yazılmış bir Android gradle projesinin kaynaklarında yeniden adlandırılmış sınıf ve paket eşlemelerini uygular.
usage: ./media3-migration.sh [-p|-c|-d|-v]|[-m|-l [-x <path>] [-f] PROJECT_ROOT]
PROJECT_ROOT: path to your project root (location of 'gradlew')
-p: list package mappings and then exit
-c: list class mappings (precedence over package mappings) and then exit
-d: list dependency mappings and then exit
-l: list files that will be considered for rewrite and then exit
-x: exclude the path from the list of file to be changed: 'app/src/test'
-m: migrate packages, classes and dependencies to AndroidX Media3
-f: force the action even when validation fails
-v: print the exoplayer2/media3 version strings of this script
-h, --help: show this help text
Taşıma komut dosyasını kullanma
Uygulamanızı güncellediğiniz sürüme karşılık gelen GitHub'daki ExoPlayer projesinin etiketinden taşıma komut dosyasını indirin:
curl -o media3-migration.sh \ "https://raw.githubusercontent.com/google/ExoPlayer/r2.19.1/media3-migration.sh"
Komut dosyasını yürütülebilir hale getirin:
chmod 744 media3-migration.sh
Seçenekler hakkında bilgi edinmek için komut dosyasını
--help
ile çalıştırın.Taşıma için seçilen dosya grubunu listelemek üzere komut dosyasını
-l
ile çalıştırın (listeleme işlemini uyarı olmadan zorlamak için-f
kullanın):./media3-migration.sh -l -f /path/to/gradle/project/root
Paketleri, sınıfları ve modülleri Media3 ile eşlemek için komut dosyasını
-m
ile çalıştırın. Komut dosyasını-m
seçeneğiyle çalıştırdığınızda değişiklikler seçili dosyalara uygulanır.- Değişiklik yapmadan doğrulama hatasında durun
./media3-migration.sh -m /path/to/gradle/project/root
- Zorunlu yürütme
Komut dosyası, ön koşulların ihlal edildiğini tespit ederse taşıma işlemi
-f
işaretiyle zorunlu kılınabilir:./media3-migration.sh -m -f /path/to/gradle/project/root
# list files selected for migration when excluding paths
./media3-migration.sh -l -x "app/src/test/" -x "service/" /path/to/project/root
# migrate the selected files
./media3-migration.sh -m -x "app/src/test/" -x "service/" /path/to/project/root
Komut dosyasını -m
seçeneğiyle çalıştırdıktan sonra aşağıdaki manuel adımları tamamlayın:
- Komutun kodunuzu nasıl değiştirdiğini kontrol edin: Bir karşılaştırma aracı kullanın ve olası sorunları düzeltin (komutta
-f
seçeneği ile aktarılmayan genel bir sorun olduğunu düşünüyorsanız bir hata kaydı gönderebilirsiniz). - Projeyi derleyin:
./gradlew clean build
'yi kullanın veya Android Studio'da Dosya > Projeyi Gradle Dosyalarıyla Senkronize Et'i, ardından Derle > Projeyi temizle'yi ve Derle > Projeyi yeniden derle'yi seçin (Android Studio'nun "Derleme - Derleme Çıktısı" sekmesinde derleme işleminizi izleyin.
Önerilen takip adımları:
- Kararlı olmayan API'lerin kullanımıyla ilgili hataları etkinleştirme sorununu çözün.
- Desteği sonlandırılan API çağrılarını değiştirme: Önerilen değişim API'sini kullanın. Android Studio'da işaretçiyi uyarının üzerine getirin ve belirli bir çağrı yerine ne kullanılacağını öğrenmek için desteği sonlandırılan sembolün JavaDoc'una bakın.
- İçe aktarma ifadelerini sıralayın: Projeyi Android Studio'da açın, ardından proje görüntüleyicisindeki bir paket klasörünü sağ tıklayın ve değiştirilen kaynak dosyaları içeren paketlerde İçe aktarma işlemlerini optimize et'i seçin.
MediaSessionConnector
yerine androidx.media3.session.MediaSession
koyun
Eski MediaSessionCompat
dünyasında MediaSessionConnector
, oynatıcının durumunu oturumun durumuyla senkronize etmekten ve denetleyicilerden, uygun oynatıcı yöntemlerine yetki verilmesi gereken komutları almaktan sorumluydu. AndroidX Media3 ile bu işlem, konnektör gerektirmeden doğrudan MediaSession
tarafından yapılır.
MediaSessionConnector'a ait tüm referansları ve kullanımları kaldırın: ExoPlayer sınıflarını ve paketlerini taşımak için otomatik komut dosyasını kullandıysanız komut dosyası, kodunuzu çözülemeyen
MediaSessionConnector
ile ilgili olarak derlenemez durumda bırakmış olabilir. Android Studio, uygulamayı derlemeye veya başlatmaya çalıştığınızda bozuk kodu gösterir.Bağımlılıklarınızı depoladığınız
build.gradle
dosyasına AndroidX Media3 oturum modülüne bir uygulama bağımlılığı ekleyin ve eski bağımlılığı kaldırın:implementation "androidx.media3:media3-session:1.4.1"
MediaSessionCompat
yerineandroidx.media3.session.MediaSession
yazın.Eski
MediaSessionCompat
'yi oluşturduğunuz kod sitesinde,androidx.media3.session.MediaSession.Builder
'ı kullanarakMediaSession
oluşturun. Oturum oluşturucuyu oluşturmak için oynatıcıyı iletin.val player = ExoPlayer.Builder(context).build() mediaSession = MediaSession.Builder(context, player) .setSessionCallback(MySessionCallback()) .build()
MySessionCallback
'ü uygulamanız tarafından gerektiği şekilde uygulayın. Bu isteğe bağlıdır. Denetleyicilerin oynatıcıya medya öğeleri eklemesine izin vermek istiyorsanızMediaSession.Callback.onAddMediaItems()
'i uygulayın. Oynatıcıya geriye dönük uyumlu bir şekilde oynatılmak üzere medya öğeleri ekleyen çeşitli mevcut ve eski API yöntemleri sunar. Buna Media3 denetleyicisininMediaController.set/addMediaItems()
yöntemlerinin yanı sıra eski API'ninTransportControls.prepareFrom*/playFrom*
yöntemleri de dahildir.onAddMediaItems
'ün örnek bir uygulamasını oturum demo uygulamasınınPlaybackService
bölümünde bulabilirsiniz.Taşıma işleminden önce oturumunuzu sildiğiniz kod sitesinde medya oturumunu yayınlayın:
mediaSession?.run { player.release() release() mediaSession = null }
Media3'te MediaSessionConnector
işlevi
Aşağıdaki tabloda, daha önce MediaSessionConnector
'te uygulanan işlevleri yöneten Media3 API'leri gösterilmektedir.
MediaSessionConnector | AndroidX Media3 |
---|---|
CustomActionProvider |
MediaSession.Callback.onCustomCommand()/
MediaSession.setCustomLayout() |
PlaybackPreparer |
MediaSession.Callback.onAddMediaItems()
(prepare() şirket içinde çağrılır)
|
QueueNavigator |
ForwardingPlayer |
QueueEditor |
MediaSession.Callback.onAddMediaItems() |
RatingCallback |
MediaSession.Callback.onSetRating() |
PlayerNotificationManager |
DefaultMediaNotificationProvider/
MediaNotification.Provider |
MediaBrowserService
'ü MediaLibraryService
'e taşıma
AndroidX Media3, MediaBrowserServiceCompat
yerine MediaLibraryService
'ü kullanıma sunar. MediaLibraryService
ve üst sınıfı MediaSessionService
'ün JavaDoc'u, API'ye ve hizmetin asenkron programlama modeline dair iyi bir giriş sunar.
MediaLibraryService
, MediaBrowserService
ile geriye dönük uyumludur. MediaBrowserCompat
veya MediaControllerCompat
kullanan bir istemci uygulaması, MediaLibraryService
'ye bağlanırken kod değişikliği olmadan çalışmaya devam eder. İstemciler, uygulamanızın MediaLibraryService
mi yoksa eski MediaBrowserServiceCompat
mi kullandığını görebilir.
Geriye dönük uyumluluğun çalışması için
AndroidManifest.xml
'de her iki hizmet arayüzünü de hizmetinize kaydettirmeniz gerekir. Bu sayede istemci, gerekli hizmet arayüzüne göre hizmetinizi bulur:<service android:name=".MusicService" android:exported="true"> <intent-filter> <action android:name="androidx.media3.session.MediaLibraryService"/> <action android:name="android.media.browse.MediaBrowserService" /> </intent-filter> </service>
Bağımlılıklarınızı depoladığınız
build.gradle
dosyasında, AndroidX Media3 oturum modülüne bir uygulama bağımlılığı ekleyin ve eski bağımlılığı kaldırın:implementation "androidx.media3:media3-session:1.4.1"
Hizmetinizi,
MediaBrowserService
yerineMediaLibraryService
'dan devralacak şekilde değiştirin. Daha önce de belirtildiği gibi,MediaLibraryService
eskiMediaBrowserService
ile uyumludur. Buna göre, hizmetin istemcilere sunduğu daha geniş API aynı kalmıştır. Bu nedenle, bir uygulamanınMediaBrowserService
'ü uygulamak için gereken mantığın çoğunu koruyup yeniMediaLibraryService
için uyarlaması olasıdır.Eski
MediaBrowserServiceCompat
ile karşılaştırıldığında temel farklılıklar şunlardır:Hizmet yaşam döngüsü yöntemlerini uygulayın: Hizmetin kendisinde geçersiz kılınması gereken yöntemler, uygulamanın kitaplık oturumunu, oynatıcıyı ve diğer kaynakları ayırdığı/sağladığı
onCreate/onDestroy
yöntemidir. Standart hizmet yaşam döngüsü yöntemlerine ek olarak, bir uygulamanınonCreate
içinde oluşturulanMediaLibrarySession
değerini döndürmek içinonGetSession(MediaSession.ControllerInfo)
değerini geçersiz kılması gerekir.MediaLibraryService.MediaLibrarySessionCallback'i uygulayın: Oturum oluşturmak için gerçek alan API yöntemlerini uygulayan bir
MediaLibraryService.MediaLibrarySessionCallback
gerekir. Bu nedenle, eski hizmetin API yöntemlerini geçersiz kılmak yerineMediaLibrarySession.Callback
yöntemlerini geçersiz kılarsınız.Ardından geri çağırma işlevi,
MediaLibrarySession
öğesini oluşturmak için kullanılır:mediaLibrarySession = MediaLibrarySession.Builder(this, player, MySessionCallback()) .build()
MediaLibrarySessionCallback API'sinin tam API'sini API dokümanlarında bulabilirsiniz.
MediaSession.Callback.onAddMediaItems()
yöntemini uygulayın:onAddMediaItems(MediaSession, ControllerInfo, List<MediaItem>)
geri çağırma işlevi, oynatıcıya geriye dönük uyumlu bir şekilde oynatılmak üzere medya öğeleri ekleyen çeşitli mevcut ve eski API yöntemlerini sunar. Buna Media3 denetleyicisininMediaController.set/addMediaItems()
yöntemlerinin yanı sıra eski API'ninTransportControls.prepareFrom*/playFrom*
yöntemleri de dahildir. Geri çağırma işlevinin örnek bir uygulamasını oturum demo uygulamasınınPlaybackService
bölümünde bulabilirsiniz.AndroidX Media3, MediaBrowserCompat.MediaItem ve MediaMetadataCompat yerine
androidx.media3.common.MediaItem
kullanıyor. Eski sınıflara bağlı kod parçalarınızın buna göre değiştirilmesi veya Media3MediaItem
ile eşlenmesi gerekir.MediaBrowserServiceCompat
'ın çıkarılabilirResult
yaklaşımının aksine, genel asynchronize programlama modeliFutures
olarak değiştirildi. Hizmet uygulamanız, bir sonucu ayırmak yerine asenkron birListenableFuture
döndürebilir veya doğrudan bir değer döndürmek için anında Future döndürebilir.
PlayerNotificationManager'ı kaldırma
MediaLibraryService
, medya bildirimlerini otomatik olarak destekler ve PlayerNotificationManager
, MediaLibraryService
veya MediaSessionService
kullanılırken kaldırılabilir.
Bir uygulama, onCreate()
içinde DefaultMediaNotificationProvider
yerine özel bir MediaNotification.Provider
ayarlayarak bildirimi özelleştirebilir. Ardından MediaLibraryService
, hizmeti gerektiği gibi ön planda başlatır.
MediaLibraryService.updateNotification()
değerini geçersiz kılarak uygulama, bildirim yayınlama ve gerektiğinde hizmeti ön planda başlatma/durdurma işlemlerinin tam kontrolünü ele alabilir.
MediaBrowser kullanarak istemci kodunu taşıma
AndroidX Media3 ile MediaBrowser
, MediaController/Player
arayüzlerini uygular ve medya kitaplığına göz atmanın yanı sıra medya oynatmayı kontrol etmek için kullanılabilir. Eski dünyada bir MediaBrowserCompat
ve MediaControllerCompat
oluşturmanız gerekiyordu. Media3'te yalnızca MediaBrowser
'yi kullanarak aynı işlemi yapabilirsiniz.
Bir MediaBrowser
oluşturulabilir ve hizmete bağlantı kurulmasını bekleyebilir:
scope.launch {
val sessionToken =
SessionToken(context, ComponentName(context, MusicService::class.java)
browser =
MediaBrowser.Builder(context, sessionToken))
.setListener(BrowserListener())
.buildAsync()
.await()
// Get the library root to start browsing the library.
root = browser.getLibraryRoot(/* params= */ null).await();
// Add a MediaController.Listener to listen to player state events.
browser.addListener(playerListener)
playerView.setPlayer(browser)
}
Arka planda oynatmayı kontrol etmek için MediaController
'i nasıl oluşturacağınızı öğrenmek üzere Medya oturumunda oynatmayı kontrol etme başlıklı makaleyi inceleyin.
Sonraki adımlar ve temizleme
Kararsız API hataları
Media3'e geçtikten sonra kararsız API kullanımlarıyla ilgili lint hataları görebilirsiniz.
Bu API'lerin kullanımı güvenlidir ve lint hataları, yeni ikili uyumluluk garantilerimizin bir yan ürünüdür. Sıkı ikili uyumluluk gerekli değilse bu hatalar @OptIn
ek açıklamayla güvenli bir şekilde atlanabilir.
Arka plan
ExoPlayer v1 veya v2, kitaplığın sonraki sürümler arasında ikili uyumluluğu hakkında katı garantiler sağlamadı. ExoPlayer API yüzeyi, uygulamaların oynatmanın neredeyse her yönünü özelleştirmesine olanak tanımak için tasarlanmış şekilde çok geniştir. ExoPlayer'ın sonraki sürümlerinde zaman zaman simgelerin yeniden adlandırılması veya diğer önemli değişiklikler (ör. arayüzdeki yeni zorunlu yöntemler) yapılır. Çoğu durumda bu kesintiler, geliştiricilerin kullanımlarını taşımaları için zaman tanımak amacıyla eski sembolün desteğinin sonlandırılmasının yanı sıra yeni sembolün kullanıma sunulmasıyla hafifletildi. Ancak bu her zaman mümkün değildi.
Bu önemli değişiklikler, ExoPlayer v1 ve v2 kitaplıklarının kullanıcıları için iki soruna neden oldu:
- ExoPlayer sürümüne yükseltme yapmak, kodun derlemeyi durdurmasına neden olabilir.
- Hem doğrudan hem de ara kitaplık üzerinden ExoPlayer'a bağımlı olan bir uygulamanın, her iki bağımlılığın da aynı sürümde olduğundan emin olması gerekiyordu. Aksi takdirde ikili program uyumsuzlukları çalışma zamanında kilitlenmelere neden olabilirdi.
Media3'te iyileştirmeler
Media3, API yüzeyinin bir alt kümesi için ikili uyumluluğu garanti eder. İkili uyumluluğu garanti etmeyen parçalar @UnstableApi
ile işaretlenmiştir. Bu ayrımı netleştirmek için kararsız API simgelerinin kullanımı, @OptIn
ile ek açıklama yapılmadığı sürece lint hatası oluşturur.
ExoPlayer v2'den Media3'e geçtikten sonra birçok kararsız API lint hatası görebilirsiniz. Bu durum, Media3'ün ExoPlayer v2'den "daha kararsız" olduğu izlenimi verebilir. Böyle bir durum söz konusu değildir. Media3 API'nin "dengeli olmayan" bölümleri, ExoPlayer v2 API yüzeyinin tamamı ile aynı kararlılık düzeyine sahiptir ve kararlı Media3 API yüzeyinin garantileri ExoPlayer v2'de hiç kullanılamaz. Tek fark, artık lint hatalarının farklı kararlılık seviyeleri hakkında sizi uyarmasıdır.
Kararsız API lint hatalarını giderme
Kararsız API'lerin Java ve Kotlin kullanımlarının @OptIn
ile nasıl ek açıklamayla belirtileceği hakkında ayrıntılı bilgi için bu lint hatalarıyla ilgili sorun giderme bölümüne bakın.
Kullanımdan Kaldırılmış API'ler
Desteği sonlandırılan API'lere yapılan çağrıların Android Studio'da üstü çizildiğini fark edebilirsiniz. Bu tür çağrıları uygun alternatiflerle değiştirmenizi öneririz. Bunun yerine hangi API'nin kullanılacağını belirten JavaDoc'u görmek için fareyle sembolün üzerine gelin.
Kod örnekleri ve demo uygulamaları
- AndroidX Media3 oturumu demo uygulaması (mobil ve WearOS)
- Özel işlemler
- Sistem kullanıcı arayüzü bildirimi, Medya düğmesi/BT
- Google Asistan oynatma kontrolü
- UAMP: Android Media Player (media3 şubesi) (mobil, AutomotiveOS)
- Sistem kullanıcı arayüzü bildirimi, Medya düğmesi/BT, Oynatma işleminin devam ettirilmesi
- Google Asistan/WearOS oynatma kontrolü
- AutomotiveOS: özel komut ve oturum açma