- "Şifresiz metin HTTP trafiğine izin verilmiyor" hatalarını düzeltme
- "SSLHandshakeException", "CertPathValidatorException" ve "ERR_CERT_AUTHORITY_INVALID" hatalarını düzeltme
- Neden bazı medya dosyalarında ileri/geri sarma yapılamıyor?
- Bazı MP3 dosyalarında ileri/geri sarma neden hatalı?
- Videomda ileri/geri sarma işlemi neden yavaş?
- Bazı MPEG-TS dosyaları neden oynatılamıyor?
- Bazı MPEG-TS dosyalarında neden altyazı bulunmuyor?
- Bazı MP4/FMP4 dosyaları neden yanlış oynatılıyor?
- Bazı akışlar neden HTTP yanıt kodu 301 veya 302 ile başarısız oluyor?
- Bazı akışlar neden UnrecognizedInputFormatException hatasıyla başarısız oluyor?
- setPlaybackParameters, bazı cihazlarda neden düzgün çalışmıyor?
- "Oynatıcıya yanlış iş parçacığından erişildi" hataları ne anlama gelir?
- "Unexpected status line: ICY 200 OK" hatasını nasıl düzeltebilirim?
- Oynatılan yayının canlı yayın olup olmadığını nasıl sorgulayabilirim?
- Uygulamam arka plandayken sesin çalmaya devam etmesini nasıl sağlarım?
- ExoPlayer içeriğimi desteklerken ExoPlayer Cast kitaplığı neden desteklemiyor?
- İçerik neden oynatılamıyor ancak hata gösterilmiyor?
- Kod çözme kitaplığının yüklenmesini ve oynatma için kullanılmasını nasıl sağlayabilirim?
- YouTube videolarını doğrudan ExoPlayer ile oynatabilir miyim?
- Video oynatma kesintili
- Kararsız API lint hataları
- Yeni optimizasyonların veya özelliklerin neden olduğu sorunları nasıl test edebilir ya da izole edebilirim?
"Şifresiz metin HTTP trafiğine izin verilmiyor" hatalarını düzeltme
Bu hata, uygulamanız Ağ Güvenliği Yapılandırması izin vermediği halde şifresiz metin HTTP trafiği (yani https:// yerine http://) istediğinde ortaya çıkar. Uygulamanız Android 9 (API düzeyi 28) veya sonraki sürümleri hedefliyorsa varsayılan yapılandırma, şifresiz metin HTTP trafiğini devre dışı bırakır.
Uygulamanızın şifresiz metin HTTP trafiğiyle çalışması gerekiyorsa buna izin veren bir Ağ Güvenliği Yapılandırması kullanmanız gerekir. Ayrıntılar için Android'in ağ güvenliği belgelerine bakın. Tüm şifresiz metin HTTP trafiğini etkinleştirmek için uygulamanızın AndroidManifest.xml dosyasındaki application öğesine android:usesCleartextTraffic="true" eklemeniz yeterlidir.
ExoPlayer demo uygulaması, varsayılan Ağ Güvenliği Yapılandırması'nı kullandığından şifresiz metin HTTP trafiğine izin vermez. Yukarıdaki talimatları uygulayarak bu özelliği etkinleştirebilirsiniz.
"SSLHandshakeException", "CertPathValidatorException" ve "ERR_CERT_AUTHORITY_INVALID" hatalarını düzeltme
SSLHandshakeException, CertPathValidatorException ve ERR_CERT_AUTHORITY_INVALID, sunucunun SSL sertifikasıyla ilgili bir sorun olduğunu gösterir. Bu hatalar ExoPlayer'a özgü değildir. Daha fazla bilgi için Android'in SSL belgelerine bakın.
Neden bazı medya dosyalarında ileri/geri sarma yapılamıyor?
ExoPlayer, doğru arama işlemleri gerçekleştirmenin tek yönteminin oynatıcının tüm dosyayı tarayıp dizine eklemesi olduğu medyalarda aramayı varsayılan olarak desteklemez. ExoPlayer, bu tür dosyaları ileri/geri sarılamaz olarak kabul eder. Çoğu modern medya kapsayıcı biçimi, arama için meta veriler (ör. örnek dizin) içerir, iyi tanımlanmış bir arama algoritmasına (ör. Ogg için enterpolasyonlu ikiye bölme araması) sahiptir veya içeriklerinin sabit bit hızı olduğunu belirtir. Bu durumlarda verimli arama işlemleri mümkündür ve ExoPlayer tarafından desteklenir.
İleri/geri sarma özelliğine ihtiyacınız varsa ancak ileri/geri sarılamayan medyanız varsa içeriğinizi daha uygun bir kapsayıcı biçimi kullanacak şekilde dönüştürmenizi öneririz. MP3, ADTS ve AMR dosyaları için, burada açıklandığı gibi dosyaların sabit bir bit hızına sahip olduğu varsayımıyla aramayı da etkinleştirebilirsiniz.
Bazı MP3 dosyalarında ileri/geri sarma neden hatalı?
Değişken bit hızı (VBR) MP3 dosyaları, tam arama gerektiren kullanım alanları için temelde uygun değildir. Bunun iki nedeni vardır:
- Tam arama için kapsayıcı biçimi, ideal olarak üstbilgide hassas bir zaman-bayt eşlemesi sağlar. Bu eşleme, oyuncunun istenen arama süresini karşılık gelen bayt ofsetine eşlemesine ve bu ofsetten medya istemeye, ayrıştırmaya ve oynatmaya başlamasına olanak tanır. MP3'te bu eşlemeyi belirtmek için kullanılabilen üstbilgiler (ör. XING üstbilgileri) maalesef genellikle kesin değildir.
- Kesin bir zamandan bayta eşleme (veya herhangi bir zamandan bayta eşleme) sağlamayan kapsayıcı biçimleri için, kapsayıcı akışta mutlak örnek zaman damgaları içeriyorsa tam arama yapmak yine de mümkündür. Bu durumda oynatıcı, arama süresini karşılık gelen bayt ofsetinin en iyi tahminine eşleyebilir, bu ofsetten medya istemeye başlayabilir, ilk mutlak örnek zaman damgasını ayrıştırabilir ve doğru örneği bulana kadar medyada etkili bir şekilde kılavuzlu ikili arama gerçekleştirebilir. Maalesef MP3, akışta mutlak örnek zaman damgaları içermediğinden bu yaklaşım mümkün değildir.
Bu nedenle, VBR MP3 dosyasında tam arama yapmanın tek yolu, dosyanın tamamını taramak ve oynatıcıda manuel olarak bir zaman-bayt eşlemesi oluşturmaktır. Bu strateji, FLAG_ENABLE_INDEX_SEEKING kullanılarak etkinleştirilebilir. Bu strateji, setMp3ExtractorFlags kullanılarak DefaultExtractorsFactory üzerinde ayarlanabilir. Bu yöntemin büyük MP3 dosyalarında iyi ölçeklenmediğini unutmayın. Özellikle kullanıcı, oynatmayı başlattıktan kısa bir süre sonra akışın sonuna yakın bir yere gitmeye çalışırsa oynatıcının, arama işlemini gerçekleştirmeden önce tüm akışı indirip dizine ekleyene kadar beklemesi gerekir. ExoPlayer'da bu durumda doğruluk yerine hız için optimizasyon yapmaya karar verdik. Bu nedenle FLAG_ENABLE_INDEX_SEEKING varsayılan olarak devre dışıdır.
Oynattığınız medyayı kontrol ediyorsanız MP4 gibi daha uygun bir kapsayıcı biçimi kullanmanızı önemle tavsiye ederiz. MP3'ün en iyi medya biçimi seçeneği olduğu bildiğimiz bir kullanım alanı yoktur.
Videomda ileri/geri sarma işlemi neden yavaş?
Oynatıcı, videoda yeni bir oynatma konumuna gittiğinde iki işlem yapması gerekir:
- Yeni oynatma konumuna karşılık gelen verileri arabelleğe yükleyin (bu veriler zaten arabelleğe alınmışsa bu işlem gerekli olmayabilir).
- Video kod çözücüyü temizleyin ve çoğu video sıkıştırma biçiminde kullanılan kare içi kodlama nedeniyle yeni oynatma konumundan önceki I karesinden (ana kare) kod çözmeye başlayın. Aramanın doğru olması (yani oynatmanın tam olarak arama konumunda başlaması) için önceki I-kare ile arama konumu arasındaki tüm karelerin kodu çözülmeli ve hemen silinmelidir (ekranda gösterilmeden).
(1) nedeniyle ortaya çıkan gecikme, oynatıcı tarafından bellekte arabelleğe alınan veri miktarı artırılarak veya veriler diske önceden önbelleğe alınarak azaltılabilir.
(2) tarafından ortaya çıkan gecikme, ExoPlayer.setSeekParameters kullanılarak aramanın doğruluğu azaltılarak veya video daha sık I-frame'lere sahip olacak şekilde yeniden kodlanarak (bu da daha büyük bir çıkış dosyasıyla sonuçlanır) azaltılabilir.
Kullanıcı bir arama çubuğunu sürüklerken arama yavaşsa scrubbing modunu (ExoPlayer.setScrubbingModeEnabled) etkinleştirin. Bu mod, hızlı aramaları birleştirir, kod çözücü işleme kapasitesini artırır ve kullanıcı arayüzü temizleyici genişliğine göre kesirli arama toleransı ayarlanmasını destekler.
Bazı MPEG-TS dosyaları neden oynatılamıyor?
Bazı MPEG-TS dosyalarında erişim birimi sınırlayıcıları (AUD'ler) bulunmaz. Varsayılan olarak ExoPlayer, kare sınırlarını kolayca algılamak için AUD'leri kullanır. Benzer şekilde, bazı MPEG-TS dosyaları IDR ana kareleri içermez. Varsayılan olarak ExoPlayer yalnızca bu tür kareleri dikkate alır.
ExoPlayer, AUD veya IDR ana kareleri içermeyen bir MPEG-TS dosyasını oynatması istendiğinde arabelleğe alma durumunda takılı kalmış gibi görünür. Bu tür dosyaları oynatmanız gerekiyorsa sırasıyla FLAG_DETECT_ACCESS_UNITS ve FLAG_ALLOW_NON_IDR_KEYFRAMES komutlarını kullanabilirsiniz. Bu işaretler, setTsExtractorFlags kullanılarak DefaultExtractorsFactory üzerinde veya oluşturucu kullanılarak DefaultHlsExtractorFactory üzerinde ayarlanabilir.
FLAG_DETECT_ACCESS_UNITS kullanımı, AUD tabanlı kare sınırı algılamaya kıyasla hesaplama açısından daha maliyetli olması dışında herhangi bir yan etkiye sahip değildir. FLAG_ALLOW_NON_IDR_KEYFRAMES kullanımı, bazı MPEG-TS dosyaları oynatılırken oynatmanın başında ve arama yapıldıktan hemen sonra geçici görsel bozulmalara neden olabilir.
Bazı MPEG-TS dosyalarında neden altyazı bulunmuyor?
Bazı MPEG-TS dosyaları CEA-608 parçaları içerir ancak bunları kapsayıcı meta verilerinde bildirmez. Bu nedenle ExoPlayer bunları algılayamaz. MPEG-TS akışında tanımlamak için kullanılabilecek erişilebilirlik kanalları da dahil olmak üzere, beklenen altyazı biçimlerinin listesini DefaultExtractorsFactory öğesine sağlayarak altyazı parçalarını manuel olarak belirtebilirsiniz:
Kotlin
val extractorsFactory = DefaultExtractorsFactory() .setTsSubtitleFormats( listOf( Format.Builder() .setSampleMimeType(MimeTypes.APPLICATION_CEA608) .setAccessibilityChannel(accessibilityChannel) // Set other subtitle format info, such as language. .build() ) ) val player: Player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()
Java
DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory() .setTsSubtitleFormats( ImmutableList.of( new Format.Builder() .setSampleMimeType(MimeTypes.APPLICATION_CEA608) .setAccessibilityChannel(accessibilityChannel) // Set other subtitle format info, such as language. .build())); Player player = new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory)) .build();
Bazı MP4/FMP4 dosyaları neden yanlış oynatılıyor?
Bazı MP4/FMP4 dosyaları, örnek listelerini atlayarak, taşıyarak veya tekrarlayarak medya zaman çizelgesini yeniden yazan düzenleme listeleri içerir. ExoPlayer, düzenleme listelerini uygulamayı kısmen destekler. Örneğin, bir senkronizasyon örneğinde başlayan örnek gruplarını geciktirebilir veya tekrarlayabilir ancak senkronizasyon örneğinde başlamayan düzenlemeler için ses örneklerini veya önceden oynatılan medyayı kesmez.
Medyanın bir kısmının beklenmedik şekilde eksik olduğunu veya tekrarlandığını görüyorsanız Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS ya da FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS ayarını yapmayı deneyin. Bu ayar, ayıklayıcının düzenleme listelerini tamamen yoksaymasına neden olur. Bunlar, setMp4ExtractorFlags veya setFragmentedMp4ExtractorFlags kullanılarak DefaultExtractorsFactory üzerinde ayarlanabilir.
Bazı akışlar neden HTTP yanıt kodu 301 veya 302 ile başarısız oluyor?
HTTP yanıt kodları 301 ve 302, yönlendirmeyi gösterir. Kısa açıklamaları Wikipedia'da bulabilirsiniz. ExoPlayer bir istekte bulunup 301 veya 302 durum koduna sahip bir yanıt aldığında normalde yönlendirmeyi takip eder ve oynatmayı normal şekilde başlatır. Bu durumun varsayılan olarak gerçekleşmediği tek durum, protokoller arası yönlendirmelerdir. Protokoller arası yönlendirme, HTTPS'den HTTP'ye veya tam tersi (ya da daha az yaygın olarak başka bir protokol çifti arasında) yönlendirmedir. Bir URL'nin protokoller arası yönlendirmeye neden olup olmadığını test etmek için wget komut satırı aracını aşağıdaki gibi kullanabilirsiniz:
wget "https://yourserver.example.com/test.mp3" 2>&1 | grep Location
Çıkış şu şekilde görünmelidir:
Location: https://secondserver.example.net/test.mp3 [following]
Location: http://thirdserver.example.org/test.mp3 [following]
Bu örnekte iki yönlendirme vardır. İlk yönlendirme https://yourserver.example.com/test.mp3 adresinden https://secondserver.example.net/test.mp3 adresine yapılıyor. İkisi de HTTPS olduğundan bu, protokoller arası bir yönlendirme değildir. İkinci yönlendirme https://secondserver.example.net/test.mp3 adresinden http://thirdserver.example.org/test.mp3 adresine yapılıyor. Bu, HTTPS'den HTTP'ye yönlendirme yapar.
Bu nedenle, protokoller arası bir yönlendirmedir. ExoPlayer, varsayılan yapılandırmasında bu yönlendirmeyi izlemez. Bu nedenle oynatma işlemi başarısız olur.
Gerekirse ExoPlayer'ı, uygulamanızda kullanılan DefaultHttpDataSource.Factory örneklerini oluştururken protokoller arası yönlendirmeleri takip edecek şekilde yapılandırabilirsiniz. Ağ yığınını seçme ve yapılandırma hakkında daha fazla bilgiyi burada bulabilirsiniz.
Bazı akışlar neden UnrecognizedInputFormatException hatasıyla başarısız oluyor?
Bu soru, aşağıdaki formda yer alan oynatma hatalarıyla ilgilidir:
UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.
Bu hatanın iki olası nedeni vardır. En yaygın neden, DASH (mpd), HLS (m3u8) veya SmoothStreaming (ism, isml) içeriği oynatmaya çalışmanız ancak oynatıcının bunu aşamalı akış olarak oynatmaya çalışmasıdır. Bu tür akışları oynatmak için ilgili ExoPlayer modülünü kullanmanız gerekir. Akış URI'sinin standart dosya uzantısıyla bitmediği durumlarda, akış türünü açıkça belirtmek için MediaItem.Builder öğesinin setMimeType parametresine MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 veya MimeTypes.APPLICATION_SS değerini de iletebilirsiniz.
İkinci ve daha az yaygın olan neden, ExoPlayer'ın oynatmaya çalıştığınız medyanın kapsayıcı biçimini desteklememesidir. Bu durumda, hata beklendiği gibi çalışmaktadır ancak kapsayıcı biçiminin ayrıntılarını ve bir test akışını ekleyerek Issue Tracker'ımıza özellik isteği gönderebilirsiniz. Yeni bir özellik isteği göndermeden önce lütfen mevcut özellik isteklerini arayın.
setPlaybackParameters neden bazı cihazlarda düzgün çalışmıyor?
Uygulamanızın hata ayıklama derlemesini Android M ve önceki sürümlerde çalıştırırken setPlaybackParameters API'yi kullandığınızda kesintili performans, duyulabilir yapaylıklar ve yüksek CPU kullanımıyla karşılaşabilirsiniz. Bunun nedeni, bu API için önemli olan bir optimizasyonun, Android'in bu sürümlerinde çalışan hata ayıklama derlemeleri için devre dışı bırakılmış olmasıdır.
Bu sorunun yalnızca hata ayıklama derlemelerini etkilediğini belirtmek isteriz. Optimizasyonun her zaman etkin olduğu yayınlanan derlemeleri etkilemez. Bu nedenle, son kullanıcılara sunduğunuz sürümler bu sorundan etkilenmez.
"Oynatıcıya yanlış iş parçacığından erişildi" hataları ne anlama gelir?
Başlangıç sayfasındaki Mesaj dizileriyle ilgili not bölümüne bakın.
"Beklenmeyen durum satırı: ICY 200 OK" hatasını nasıl düzeltebilirim?
Bu sorun, sunucu yanıtı HTTP uyumlu bir durum satırı yerine ICY durum satırı içeriyorsa ortaya çıkabilir. ICY durum satırları kullanımdan kaldırılmıştır ve kullanılmamalıdır. Bu nedenle, sunucuyu kontrol ediyorsanız HTTP uyumlu bir yanıt sağlayacak şekilde güncellemeniz gerekir. Bunu yapamıyorsanız ExoPlayer OkHttp kitaplığını kullanmak sorunu çözecektir. Bu kitaplık, ICY durum satırlarını doğru şekilde işleyebilir.
Oynatılan akışın canlı yayın olup olmadığını nasıl sorgulayabilirim?
Oynatıcının isCurrentWindowLive yöntemini sorgulayabilirsiniz. Ayrıca, pencerenin dinamik olup olmadığını (yani zaman içinde güncellenmeye devam edip etmediğini) öğrenmek için isCurrentWindowDynamic değerini kontrol edebilirsiniz.
Uygulamam arka plandayken sesin çalmaya devam etmesini nasıl sağlarım?
Uygulamanız arka plandayken sesin çalmaya devam etmesi için aşağıdaki adımları uygulayın:
- Çalışan bir ön plan hizmetiniz olmalıdır. Bu sayede sistem, kaynakları boşaltmak için işleminizi sonlandırmaz.
WifiLockveWakeLocksahibi olmanız gerekir. Bunlar, sistemin kablosuz radyo ve CPU'yu uyanık tutmasını sağlar.ExoPlayerkullanıyorsanızsetWakeModeişlevini çağırarak bunu kolayca yapabilirsiniz. Bu işlev, gerekli kilitleri doğru zamanlarda otomatik olarak alır ve serbest bırakır.
Ses çalma işlemi biter bitmez kilitleri serbest bırakmanız (setWakeMode kullanmıyorsanız) ve hizmeti durdurmanız önemlidir.
ExoPlayer içeriğimi desteklerken ExoPlayer Cast kitaplığı neden desteklemiyor?
Oynatmaya çalıştığınız içerik CORS özellikli olmayabilir. Cast çerçevesi, içeriğin oynatılabilmesi için CORS'un etkinleştirilmesini gerektirir.
İçerik neden oynatılamıyor ancak hata gösterilmiyor?
İçeriği oynattığınız cihaz, belirli bir medya örneği biçimini desteklemiyor olabilir. Bunu, oynatıcınıza dinleyici olarak bir EventLogger ekleyip Logcat'te şuna benzer bir satır arayarak kolayca doğrulayabilirsiniz:
[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE
NO_UNSUPPORTED_TYPE, cihazın mimeType tarafından belirtilen medya örneği biçiminin kodunu çözemediği anlamına gelir. Desteklenen örnek biçimleri hakkında bilgi edinmek için Android medya biçimleri belgelerine bakın. Kod çözme kitaplığının yüklenmesini ve oynatma için kullanılmasını nasıl sağlayabilirim? sorusu da faydalı olabilir.
Kod çözme kitaplığının yüklenmesini ve oynatma için kullanılmasını nasıl sağlayabilirim?
- Çoğu kod çözücü kitaplığında, bağımlılıkları kontrol etmek ve oluşturmak için manuel adımlar bulunur. Bu nedenle, ilgili kitaplığın README dosyasındaki adımları uyguladığınızdan emin olun. Örneğin, ExoPlayer FFmpeg kitaplığı için libraries/decoder_ffmpeg/README.md adresindeki talimatları uygulamanız gerekir. Bu talimatlar arasında, oynatmak istediğiniz tüm biçimler için kod çözücüleri etkinleştirmek üzere yapılandırma işaretlerini iletmek de yer alır.
- Yerel kod içeren kitaplıklar için README dosyasında belirtilen Android NDK'nın doğru sürümünü kullandığınızdan emin olun ve yapılandırma ile derleme sırasında görünen hatalara dikkat edin. README dosyasındaki adımları uyguladıktan sonra, desteklenen her mimari için kitaplık yolunun
libsalt dizininde.sodosyalarının göründüğünü görmeniz gerekir. - Demo uygulamasında kitaplığı kullanarak oynatmayı denemek için Paket kod çözücüleri etkinleştirme başlıklı makaleyi inceleyin. Kitaplığı kendi uygulamanızdan kullanmayla ilgili talimatlar için kitaplığın BENİOKU dosyasını inceleyin.
DefaultRenderersFactorykullanıyorsanız kod çözücü yüklendiğinde Logcat'te "Loaded FfmpegAudioRenderer" gibi bilgi düzeyinde bir günlük satırı görürsünüz. Bu yoksa uygulamanın kod çözme kitaplığına bağımlılığı olduğundan emin olun.- Logcat'te
LibraryLoadertarafından oluşturulan uyarı düzeyinde günlükler görüyorsanız bu, kitaplığın yerel bileşeninin yüklenemediğini gösterir. Bu durumda, kitaplığın BENİOKU dosyasındaki adımları doğru şekilde uyguladığınızdan ve talimatları uygularken hata çıkmadığından emin olun.
Kod çözme kitaplıklarını kullanırken sorun yaşamaya devam ederseniz lütfen Media3 Issue Tracker'da ilgili son sorunları kontrol edin. Yeni bir sorun bildirmeniz gerekiyorsa ve bu sorun kitaplığın yerel kısmını oluşturmayla ilgiliyse sorunu teşhis etmemize yardımcı olmak için lütfen README talimatlarını çalıştırarak elde ettiğiniz tam komut satırı çıkışını ekleyin.
YouTube videolarını doğrudan ExoPlayer ile oynatabilir miyim?
Hayır, ExoPlayer, YouTube'daki videoları (ör. https://www.youtube.com/watch?v=... biçimindeki URL'ler) oynatamaz. Bunun yerine, Android'de YouTube videolarını oynatmanın resmi yöntemi olan YouTube iFrame Player API'yi kullanmanız gerekir.
Video oynatma takılıyor
Örneğin, içerik bit hızı veya çözünürlüğü cihazın kapasitesini aşıyorsa cihaz, içeriğin kodunu yeterince hızlı çözemeyebilir. Bu tür cihazlarda iyi performans elde etmek için daha düşük kaliteli içerikler kullanmanız gerekebilir.
Android 6.0 (API düzeyi 23) ile Android 11 (API düzeyi 30) arasındaki bir Android sürümünü çalıştıran cihazlarda, özellikle DRM korumalı veya yüksek kare hızlı içerikleri oynatırken video takılması sorunu yaşıyorsanız eşzamansız arabellek sırasını etkinleştirmeyi deneyebilirsiniz.
Kararsız API lint hataları
Media3, API yüzeyinin bir alt kümesi için ikili program uyumluluğunu garanti eder. İkili program uyumluluğunu garanti etmeyen bölümler @UnstableApi ile işaretlenir. Bu ayrımı netleştirmek için kararsız API sembollerinin kullanımları, @OptIn ile ek açıklama eklenmediği sürece lint hatası oluşturur.
@UnstableApi ek açıklaması, bir API'nin kalitesi veya performansı hakkında hiçbir şey ifade etmez, yalnızca "API dondurulmuş" olmadığını belirtir.
Kararsız API lint hatalarını ele almak için iki seçeneğiniz vardır:
- Aynı sonucu veren kararlı bir API kullanmaya geçin.
- Kararsız API'yi kullanmaya devam edin ve kullanımı aşağıda gösterildiği gibi
@OptInile ek açıklama ekleyin.
@OptIn ek açıklamasını ekleme
Android Studio, ek açıklamayı eklemenize yardımcı olabilir:
Belirli kullanım sitelerine manuel olarak da ek açıklama ekleyebilirsiniz:
Kotlin
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }
Java
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }
package-info dosyası ekleyerek paketlerin tamamını etkinleştirebilirsiniz:
Kotlin
// In your package-info.kt
@OptIn(UnstableApi::class)
package name.of.your.package
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
Java
// In your package-info.java
@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
Projelerin tamamı, lint.xml dosyalarındaki belirli lint hatası engellenerek etkinleştirilebilir:
<?xml version="1.0" encoding="utf-8"?>
<lint>
<issue id="UnsafeOptInUsageError">
<option name="opt-in" value="androidx.media3.common.util.UnstableApi" />
</issue>
</lint>
Kullanılmaması gereken bir kotlin.OptIn ek açıklaması da vardır. androidx.annotation.OptIn ek açıklamasını kullanmak önemlidir.
Yeni optimizasyonların veya özelliklerin neden olduğu sorunları nasıl test edebilir ya da izole edebilirim?
Media3, yeni eklenen özelliklerin ve optimizasyonların Canary modunda varsayılan olarak etkinleştirildiği bir özellik bayrağı altyapısı içerir.
Uygulamanızdaki bir sorunun veya gerilemenin yeni kullanıma sunulan bir özellik ya da optimizasyonla ilgili olduğundan şüpheleniyorsanız Canary modunu geçici olarak devre dışı bırakabilirsiniz:
Flags.setCanaryModeEnabled(false);
Dilerseniz Flags.disableFlag(flagId) kullanarak belirli özellik bayraklarını tek tek devre dışı bırakabilirsiniz. Canary modunu yapılandırma, bayrakları geçersiz kılma ve uzaktan kapatma anahtarları ayarlama hakkında daha fazla bilgi için Özellik bayrakları ve Canary modu kılavuzuna bakın.