- "Cleartext 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 arama yapılamıyor?
- Neden bazı MP3 dosyalarında arama işlemi doğru sonuç vermiyor?
- Videomda neden yavaş sarılıyor?
- Bazı MPEG-TS dosyaları neden oynatılamıyor?
- Neden bazı MPEG-TS dosyalarında altyazı bulunmuyor?
- Bazı MP4/FMP4 dosyaları neden yanlış oynatılıyor?
- Neden bazı akışlar HTTP yanıt kodu 301 veya 302 ile başarısız oluyor?
- Bazı akışlar neden UnrecognizedInputFormatException ile başarısız oluyor?
- Neden setPlaybackParameters bazı cihazlarda düzgün çalışmıyor?
- "Player is accessed on the wrong thread" hataları ne anlama geliyor?
- "Beklenmedik durum satırı: ICY 200 OK" hatasını nasıl düzeltebilirim?
- Oynatılan akışın canlı yayın olup olmadığını nasıl sorgulayabilirim?
- Uygulamam arka plana alındığında sesin çalmaya devam etmesini nasıl sağlayabilirim?
- Neden ExoPlayer içeriğimi desteklerken ExoPlayer Cast kitaplığı desteklemiyor?
- İçerik neden oynatılamıyor ancak hata gösterilmiyor?
- Çözümleme 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 sırasında takılma oluyor
- Kararsız API lint hataları
"Cleartext HTTP traffic not permitted" hatalarını düzeltme
Uygulamanız, Network Security Configuration ayarı izin vermediği halde düz metin HTTP trafiği (yani https://
yerine http://
) istediğinde bu hata oluşur. Uygulamanız Android 9'u (API düzeyi 28) veya sonraki sürümleri hedefliyorsa varsayılan yapılandırmada şifrelenmemiş HTTP trafiği devre dışı bırakılır.
Uygulamanızın düz 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
öğesinin application
bölümüne android:usesCleartextTraffic="true"
eklemeniz yeterlidir.
ExoPlayer demo uygulaması, varsayılan Ağ Güvenliği Yapılandırması'nı kullandığı için ş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 sorunu 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 veya geri sarma yapılamıyor?
ExoPlayer, varsayılan olarak yalnızca oynatıcının tüm dosyayı tarayıp dizine eklemesiyle doğru arama işlemlerinin yapılabildiği medyada arama yapmayı desteklemez. ExoPlayer bu tür dosyaları aranamayan dosyalar 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ında olduğunu belirtir. Bu durumlarda verimli arama işlemleri mümkündür ve ExoPlayer tarafından desteklenir.
Sarma işlemine ihtiyacınız varsa ancak sarılamayan medya kullanıyorsanız içeriğinizi daha uygun bir kapsayıcı biçime dönüştürmenizi öneririz. MP3, ADTS ve AMR dosyaları için, dosyaların sabit bit hızına sahip olduğu varsayımıyla arama özelliğini de etkinleştirebilirsiniz. Bu işlem burada açıklanmıştır.
Neden bazı MP3 dosyalarında arama işlemi doğru yapılmıyor?
Değişken bit hızlı (VBR) MP3 dosyaları, tam arama gerektiren kullanım alanları için temel olarak uygun değildir. Bunun iki nedeni vardır:
- Tam arama için kapsayıcı biçim, ideal olarak üstbilgide tam bir zaman-bayt eşlemesi sağlar. Bu eşleme, bir oyuncunun istenen arama süresini karşılık gelen bayt uzaklığına eşlemesine ve bu uzaklıktan 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.
- Tam bir zaman-bayt eşlemesi (veya herhangi bir zaman-bayt eşlemesi) sağlamayan kapsayıcı biçimlerde, kapsayıcı akışta mutlak örnek zaman damgaları içeriyorsa yine de tam bir arama işlemi gerçekleştirmek mümkündür. Bu durumda, oynatıcı arama süresini ilgili bayt uzaklığının en iyi tahminine eşleyebilir, bu uzaklıktan medya istemeye başlayabilir, ilk mutlak örnek zaman damgasını ayrıştırabilir ve doğru örneği bulana kadar medyada etkili bir şekilde yönlendirilmiş 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 nedenlerle, VBR MP3 dosyalarında tam olarak arama yapmanın tek yolu, dosyanın tamamını tarayıp oynatıcıda zaman-bayt eşlemesini manuel olarak oluşturmaktır. Bu strateji, FLAG_ENABLE_INDEX_SEEKING
kullanılarak etkinleştirilebilir. FLAG_ENABLE_INDEX_SEEKING
, setMp3ExtractorFlags
kullanılarak DefaultExtractorsFactory
üzerinde ayarlanabilir. Özellikle kullanıcı, oynatmayı başlattıktan kısa süre sonra akışın sonuna yakın bir yere gitmeye çalışırsa büyük MP3 dosyalarında iyi ölçeklenmediğini unutmayın. Bu durumda oynatıcının, arama işlemini gerçekleştirmeden önce akışın tamamını indirip dizine eklemesini beklemesi gerekir. ExoPlayer'da bu durumda doğruluk yerine hızı optimize etmeye karar verdik ve bu nedenle FLAG_ENABLE_INDEX_SEEKING
varsayılan olarak devre dışı bırakıldı.
Oynattığınız medyayı kontrol ediyorsanız MP4 gibi daha uygun bir kapsayıcı biçim kullanmanızı önemle tavsiye ederiz. MP3'ün en iyi medya biçimi seçimi olduğu herhangi bir kullanım alanı bilmiyoruz.
Videomda neden yavaş sarılıyor?
Oynatıcı, videoda yeni bir oynatma konumuna gitmek istediğinde iki şey yapması gerekir:
- Yeni oynatma konumuna karşılık gelen verileri arabelleğe yükleyin (bu veriler zaten arabelleğe alınmışsa gerekli olmayabilir).
- Çoğu video sıkıştırma biçiminin kullandığı kare içi kodlama nedeniyle video kod çözücüyü temizleyin ve yeni oynatma konumundan önce I karesinden (anahtar kare) başlayarak kod çözme işlemini başlatın. Arama işleminin doğru olmasını sağlamak için (yani oynatma, arama konumunda tam olarak başlar) önceki I-frame ile arama konumu arasındaki tüm karelerin kodu çözülmeli ve hemen atılmalıdır (ekranda gösterilmeden).
(1) tarafından oluşturulan gecikme, oynatıcı tarafından bellekte arabelleğe alınan veri miktarını artırarak veya verileri diske önceden önbelleğe alarak azaltılabilir.
(2) tarafından oluşturulan gecikme, ExoPlayer.setSeekParameters
kullanılarak aramanın doğruluğu azaltılarak veya videonun daha sık I-frame'ler içerecek şekilde yeniden kodlanarak (bu, daha büyük bir çıkış dosyasıyla sonuçlanır) azaltılabilir.
Bazı MPEG-TS dosyaları neden oynatılamıyor?
Bazı MPEG-TS dosyaları, erişim birimi sınırlayıcıları (AUD) içermez. Varsayılan olarak ExoPlayer, kare sınırlarını uygun maliyetle algılamak için AUD'lere güvenir. Benzer şekilde, bazı MPEG-TS dosyaları IDR anahtar kareleri içermez. Varsayılan olarak, ExoPlayer yalnızca bu türdeki anahtar kareleri dikkate alır.
ExoPlayer, AUD'leri veya IDR anahtar kareleri olmayan bir MPEG-TS dosyasını oynatması istendiğinde arabelleğe alma durumunda takılıp 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
kullanarak oynatabilirsiniz. Bu işaretler, setTsExtractorFlags
kullanılarak DefaultExtractorsFactory
üzerinde veya oluşturucu kullanılarak DefaultHlsExtractorFactory
üzerinde ayarlanabilir.
FLAG_DETECT_ACCESS_UNITS
kullanımı, AUD tabanlı çerçeve sınırı algılamaya kıyasla hesaplama açısından maliyetli olmanın dışında herhangi bir yan etkiye neden olmaz. FLAG_ALLOW_NON_IDR_KEYFRAMES
kullanımı, bazı MPEG-TS dosyaları oynatılırken oynatmanın başında ve arama işleminden hemen sonra geçici görsel bozulmaya neden olabilir.
Neden bazı MPEG-TS dosyalarında 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. Beklenen altyazı biçimlerinin listesini DefaultExtractorsFactory
öğesine sağlayarak altyazı parçalarını manuel olarak belirtebilirsiniz. Bu biçimler, MPEG-TS akışında altyazı parçalarını tanımlamak için kullanılabilecek erişilebilirlik kanallarını da içerir:
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 listelerinin uygulanmasını kısmen destekler. Örneğin, senkronizasyon örneğiyle başlayan örnek gruplarını geciktirebilir veya tekrarlayabilir ancak senkronizasyon örneğiyle başlamayan düzenlemeler için ses örneklerini veya ön rulo 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 ayarlar, ayıklayıcının düzenleme listelerini tamamen yok saymasına neden olur. Bu ayarlar, setMp4ExtractorFlags
veya setFragmentedMp4ExtractorFlags
kullanılarak DefaultExtractorsFactory
üzerinde ayarlanabilir.
Neden bazı yayınlar 301 veya 302 HTTP yanıt koduyla başarısız oluyor?
HTTP yanıt kodları 301 ve 302, yönlendirme olduğunu gösterir. Kısa açıklamaları Wikipedia'da bulabilirsiniz. ExoPlayer bir istekte bulunduğunda ve 301 veya 302 durum koduyla 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 yönde (ya da daha az yaygın olarak başka bir protokol çifti arasında) yönlendirme yapan bir yönlendirmedir. Bir URL'nin protokoller arası yönlendirmeye neden olup olmadığını wget komut satırı aracını kullanarak aşağıdaki şekilde test edebilirsiniz:
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
alanından https://secondserver.example.net/test.mp3
alanına yapılıyor. Her ikisi de HTTPS olduğundan bu, protokoller arası bir yönlendirme değildir. İkinci yönlendirme, https://secondserver.example.net/test.mp3
alanından http://thirdserver.example.org/test.mp3
alanına yapılıyor. Bu, HTTPS'den HTTP'ye yönlendirme yaptığından protokoller arası bir yönlendirmedir. ExoPlayer, varsayılan yapılandırmasında bu yönlendirmeyi takip etmez. Bu nedenle oynatma işlemi başarısız olur.
Gerekirse uygulamanızda kullanılan DefaultHttpDataSource.Factory
örneklerini oluştururken ExoPlayer'ı protokoller arası yönlendirmeleri takip edecek şekilde yapılandırabilirsiniz. Ağ yığını seçme ve yapılandırma hakkında bilgi edinmek için burayı inceleyin.
Bazı akışlar neden UnrecognizedInputFormatException ile başarısız oluyor?
Bu soru, aşağıdaki biçimdeki 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ğini oynatmaya çalışmanız ancak oynatıcının bunu aşamalı akış olarak oynatmaya çalışmasıdır. Bu tür yayınları 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 MimeTypes.APPLICATION_MPD
, MimeTypes.APPLICATION_M3U8
veya MimeTypes.APPLICATION_SS
değerlerini MediaItem.Builder
öğesinin setMimeType
parametresine de iletebilirsiniz.
Daha az yaygın olan ikinci neden ise ExoPlayer'ın, oynatmaya çalıştığınız medyanın kapsayıcı biçimini desteklememesidir. Bu durumda, hata beklendiği gibi çalışıyor. Ancak kapsayıcı biçiminin ayrıntılarını ve bir test akışını da ekleyerek sorun izleyicimize özellik isteği gönderebilirsiniz. Yeni bir özellik isteği göndermeden önce lütfen mevcut istekler arasında arama yapın.
Neden setPlaybackParameters 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'sini kullandığınızda performansın düzensiz olması, duyulabilir yapılar ve yüksek CPU kullanımı gibi sorunlarla 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ılmasıdır.
Bu sorunun yalnızca hata ayıklama derlemelerini etkilediğini unutmayın. Optimizasyonun her zaman etkin olduğu yayın derlemelerini etkilemez. Bu nedenle, son kullanıcılara sunduğunuz sürümler bu sorundan etkilenmemelidir.
"Player is accessed on the wrong thread" (Oynatıcıya yanlış iş parçacığında erişiliyor) hataları ne anlama gelir?
Başlarken sayfasındaki İş parçacığı oluşturma hakkında not bölümüne bakın.
"Unexpected status line: 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 oluşabilir. 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. Çünkü 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?
Oyuncunun 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
işaretini kontrol edebilirsiniz.
Uygulamam arka plana alındığında sesin çalmaya devam etmesini nasıl sağlayabilirim?
Uygulamanız arka plandayken sesin çalınmaya devam etmesini sağlamak için aşağıdaki adımları uygulayın:
- Çalışan bir ön plan hizmetiniz olmalıdır. Bu, sistemin kaynakları boşaltmak için işleminizi sonlandırmasını önler.
WifiLock
veWakeLock
sahibi olmanız gerekir. Bu ayarlar, sistemin kablosuz radyo ve CPU'yu uyanık tutmasını sağlar.ExoPlayer
kullanıyorsanızsetWakeMode
numaralı telefonu arayarak bu işlemi kolayca yapabilirsiniz. Bu işlem, gerekli kilitleri doğru zamanlarda otomatik olarak alır ve serbest bırakır.
setWakeMode
kullanılmıyorsa kilitleri serbest bırakmanız ve ses çalınmadığı anda hizmeti durdurmanız önemlidir.
ExoPlayer neden içeriğimi destekliyor ancak ExoPlayer Cast kitaplığı desteklemiyor?
Oynatmaya çalıştığınız içerik CORS etkinleştirilmemiş olabilir. 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. Bu, oynatıcınıza dinleyici olarak EventLogger
eklenip Logcat'te buna benzer bir satır aranarak kolayca doğrulanabilir:
[ ] 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çimler hakkında bilgi için Android medya biçimleri dokümanlarına bakın. Oynatma için kullanılacak bir kod çözme kitaplığını nasıl yükleyebilirim? başlıklı makale de faydalı olabilir.
Oynatma için kullanılacak bir kod çözme kitaplığını nasıl yükleyebilirim?
- Çoğu kod çözücü kitaplığında bağımlılıkları kontrol etmek ve oluşturmak için manuel adımlar vardır. 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 dosyasındaki talimatlara uyulması ve oynatmak istediğiniz tüm biçimler için kod çözücüleri etkinleştirmek üzere yapılandırma işaretlerinin iletilmesi gerekir.
- 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 ve oluşturma sırasında görünen hatalara dikkat edin. README dosyasındaki adımları uyguladıktan sonra, desteklenen her mimari için kitaplığın yolundaki
libs
alt dizininde.so
dosyaları görünmelidir. - Demo uygulamasındaki kitaplığı kullanarak oynatmayı denemek için paketlenmiş kod çözücüleri etkinleştirme başlıklı makaleyi inceleyin. Kitaplığı kendi uygulamanızda kullanmayla ilgili talimatlar için kitaplığın README dosyasını inceleyin.
DefaultRenderersFactory
kullanıyorsanız kod çözücü yüklendiğinde Logcat'te "Loaded FfmpegAudioRenderer" gibi bilgi düzeyinde bir günlük satırı görmeniz gerekir. Bu eksikse uygulamanın kod çözme kitaplığına bağımlı olduğundan emin olun.- Logcat'te
LibraryLoader
ile ilgili 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 README dosyasındaki adımları doğru şekilde uyguladığınızı ve talimatları uygularken herhangi bir hata çıkmadığını kontrol edin.
Kod çözme kitaplıklarını kullanırken sorun yaşamaya devam ederseniz lütfen Media3 sorun izleyicisinde ilgili son sorunları kontrol edin. Yeni bir sorun bildirmeniz gerekiyorsa ve bu sorun kitaplığın yerel kısmını oluşturmayla ilgiliyse lütfen sorunu teşhis etmemize yardımcı olmak için README talimatlarını çalıştırmanın 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, YouTube videolarını Android'de oynatmanın resmi yolu olan YouTube iFrame Player API'yi kullanmanız gerekir.
Video oynatma sırasında takılma sorunu yaşanıyor
Örneğin, içerik bit hızı veya çözünürlüğü cihazın özelliklerini aşıyorsa cihaz, içeriği yeterince hızlı çözemeyebilir. Bu tür cihazlarda iyi performans elde etmek için daha düşük kaliteli içerik 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 ile korunan veya yüksek kare hızlı içerikleri oynatırken videoda takılma sorunu yaşıyorsanız eşzamansız arabellek kuyruğuna almayı etkinleştirmeyi deneyebilirsiniz.
Kararsız API lint hataları
Media3, API yüzeyinin bir alt kümesi için ikili uyumluluğu garanti eder. İkili uyumluluğu garanti etmeyen bölümler @UnstableApi
ile işaretlenir. Bu ayrımı netleştirmek için, kararsız API sembollerinin kullanımları @OptIn
ile 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-frozen" olmadığı anlamına gelir.
Kararsız API lint hatalarını işlemek için iki seçeneğiniz vardır:
- Aynı sonucu veren kararlı bir API'ye geçin.
- Kararsız API'yi kullanmaya devam edin ve kullanımı daha sonra gösterildiği gibi
@OptIn
ile açıklayın.
@OptIn
ek açıklamasını ekleyin.
Android Studio, ek açıklamayı eklemenize yardımcı olabilir:

Kotlin'de belirli kullanım sitelerine manuel olarak da açıklama ekleyebilirsiniz:
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }
Java'da da:
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }
package-info.java
dosyası ekleyerek tüm paketleri etkinleştirebilirsiniz:
@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
Belirli lint hatası lint.xml
dosyasında bastırılarak projelerin tamamı 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>
Ayrıca, kullanılmaması gereken bir kotlin.OptIn
notu da vardır. androidx.annotation.OptIn
ek açıklamasını kullanmanız önemlidir.