Android 17'den itibaren ses çerçevesi, ses çalma, ses odağı istekleri ve ses seviyesi değişikliği API'leri dahil olmak üzere arka plandaki ses etkileşimlerine kısıtlamalar getirerek bu değişikliklerin kullanıcı tarafından bilinçli olarak başlatılmasını sağlar.
Android 17'de çalışan ve bu arka plan ses etkileşimlerine sahip olan tüm uygulamaların görünür bir etkinliği olmalı veya SHORT_SERVICE türünde olmayan bir ön plan hizmeti çalıştırmalıdır. Bu durum, uygulamanın API düzeyi 37'yi hedefleyip hedeflemediğinden bağımsız olarak geçerlidir.
Uygulama Android 17'yi (API düzeyi 37) hedefliyorsa ek bir kısıtlama vardır. Uygulama arka planda çalışıyorsa kullanım sırasında (WIU) özelliklerine sahip bir ön plan hizmeti çalıştırıyor olmalıdır. (Kullanıcı tarafından başlatılan bir işleme yanıt olarak veya uygulama kullanıcı tarafından görülebilir durumdayken başlatılan ön plan hizmetlerine WIU özellikleri verilir.) Ancak uygulama kesin zamanlı alarm izni aldıysa ve USAGE_ALARM özelliğine sahip ses akışlarında değişiklik yapıyorsa WIU özellikleri şartından feragat edilir.
Uygulama, geçerli bir yaşam döngüsünde değilken ses API'lerini çağırmaya çalışırsa ses çalma ve ses seviyesi değiştirme API'leri, istisna oluşturmadan veya hata mesajı vermeden sessizce başarısız olur. Ses odağı API'si, AUDIOFOCUS_REQUEST_FAILED sonuç koduyla başarısız oluyor.
Bu değişikliği neden yapıyoruz?
Bu kısıtlamaların amacı, arka planda ses çalma özelliğinin istem dışı olarak hatalı çalışmasını azaltmaktır. Buna örnek olarak aşağıdakiler verilebilir:
- Ön plan hizmeti olmadan ses çalan uygulamalar dondurulabilir. Uygulama dondurulmuş durumdan çıktığında ses oynatmayı beklenmedik bir şekilde, muhtemelen saatler sonra devam ettirir.
- Ön plan hizmeti olmadan ses çalan uygulamalar, çeşitli çalışma kısıtlamalarıyla karşılaştı ve bu durum ses performansının kesintili olmasına neden oldu.
- Oynatma, etkinlik yaşam döngüsünden ayrılmış. Bu durum, oynatma oturumunun veya odak etkinliklerinin sızdırılmasına neden olabilir ve kullanıcının oynatmayı durdurma imkanı olmadan devam etmesine yol açabilir.
Geliştiricilerin uygulamalarını test etmelerini ve ses kullanımına yönelik kasıtlı kullanım alanlarının olumsuz etkilenmesi durumunda davranış değişikliğiyle ilgili geri bildirimde bulunmalarını öneririz. Lütfen sorunları bu Android 17 uygulama uyumluluğu sorun izleyicisini kullanarak bildirin.
Etkilenen arka planda ses kullanım alanlarını belirleme
Ses çalma uygulamanızı denetleyin ve uygulamanızın, koşullu durumlarda bile arka planda ses etkileşimi işlevi sunmayı amaçlayıp amaçlamadığını belirleyin.
Uygulamanız yalnızca kullanıcıya görünür bir etkinlik gösterirken ses çalmayı veya ses API'lerini kullanmayı amaçlıyorsa (pencere içinde pencere (PiP) modunu kullanmak dahil) bu değişikliklerden etkilenmez.
Uygulamanız, görüntülü görüşme uygulamaları da dahil olmak üzere VoIP işlevi sağlıyorsa ses kaydını başarıyla gerçekleştirmek için oynatma ile ilgili olarak getirilen şartları (genellikle önerilen telekom API'lerini kullanarak) zaten karşılıyor olması gerekir. Bu nedenle, bu durumdan etkilenmesi olası değildir.
Uygulamanız, ekran kapalıyken veya etkinliğiniz görünür değilken ses çalmaya devam etmeyi amaçlıyorsa (bu durum en çok müzik yayını uygulamalarında veya podcast uygulamalarında görülür) uygulamanızın arka planda ses işlevi sağladığı kabul edilir ve yeni şartları karşılaması gerekir.
Etkilenmesi muhtemel arka plan ses senaryoları
Uygulamanız, açıkken başlatılan veya açık bir kullanıcı tetikleyicisine yanıt olarak başlatılan sesli etkileşimi devam ettirme modelini izlemiyorsa uygulamanızın işlevselliği sessizce engellenebilir.
Örneğin, uygulamanız BOOT_COMPLETE yanıt olarak bir ön plan hizmeti başlatır ve sesle etkileşim kurmaya çalışırsa bu işlem engellenir.
Etkiyi azaltmak için arka plan sesleriyle ilgili en iyi uygulamalar
Arka planda ses oynatmayı yönetmek için media3 Jetpack kitaplığının
MediaSessionServicebileşenini kullanın.Bunu yaparsanız kitaplık, oynatma yaşam döngüsünü yönetmeye yardımcı olduğu için uygulamanız arka plan güçlendirmeden etkilenmez.
Media3 kitaplığını kullanmıyorsanız
mediaPlaybackFGS'yi manuel olarak başlatmanız gerekir. Arka planda ses çalınabilecekse ön plan hizmetini her zaman uygulama ön plandayken başlatın.Örneğin, uygulamanız genellikle yalnızca ön planda çalışan ancak ekran kapalıyken oynatmaya devam etmek için kullanıcıya olanak tanıyan bir video akışı uygulamasıysa kullanıcı tarafından başlatılan oynatma tetikleyicisi gerçekleştiğinde uygulamanızın yine de bir ön plan hizmeti başlatması gerekir.
Bunu yaptığınızda ön plan hizmeti, WIU özellikleriyle başlatılır.
10 dakikadan kısa süren geçici arızalar sırasında
mediaPlaybackFGS'yi etkin tutun.Uygulamanızda ağ etkinliği nedeniyle arabelleğe alma sorunu gibi geçici bir hata varsa veya
AUDIOFOCUS_LOSS_TRANSIENTgibi beklenen geçici bir kesinti varsa oynatma niyeti devam etmelidir. Bu nedenle FGS'niz etkin kalmalıdır.Oynatma bittiğinde ön plan hizmetini durdurun ve yalnızca kullanıcı açıkça devam ettirirse oynatmayı yeniden başlatın.
Oynatmayı sonlandırmak için kalıcı bir sinyal (ör. içerik otomatik oynatma olmadan tamamlandı,
AUDIOFOCUS_LOSS, UMO'dan bir duraklatma etkinliği veya medya tuşu etkinliği) ya da kurtarılamayan bir hata olması durumunda uygulamanız ses etkileşimini durdurmalı, ön plan hizmetini durdurmalı ve medya oturumunu sonlandırmalıdır. Tüm bunları yapmak, kullanıcının istediği arka plan ses etkileşimini "tamamlama" anlayışına karşılık gelir. Bu işlemden sonra uygulamanızın arka planda ses etkileşimi özellikleri devre dışı bırakılır.Ardından, kullanıcı oynatmayı açıkça devam ettirirse (ör. uygulamanızın kullanıcı arayüzü veya evrensel medya nesnesi oynatma düğmesi aracılığıyla) ses oynatmayı başlatma amacı geri dönmeli ve yeni bir ön plan hizmeti başlatılmalıdır.
adb kabuk komutlarıyla ses çalma davranışını test etme
Değişiklikleri test etme
Aşağıdaki ADB komutunu çalıştırarak uygulamanızın Android 17 veya sonraki sürümleri (Beta 3'ten itibaren) çalıştıran uygulamalardaki uyumluluğunu test edebilirsiniz:
adb shell cmd audio set-enable-hardening <enable|disable|throw>
Bu komutun aşağıdaki seçenekleri vardır:
enable: Tüm uygulamalar için tüm ses güçlendirme kısıtlamalarını etkinleştirir. WIU ön plan hizmetleri şartı, uygulamanın Android 17'yi (API düzeyi 37) hedefleyip hedeflemediğine bakılmaksızın geçerlidir. Ayrıca, uygulama alarm akışlarında değişiklik yapıyor ve kesin zamanlı alarm iznine sahip olsa bile bu şart uygulanır.disable: Tüm ses güçlendirme kısıtlamalarını devre dışı bırakır.throw:enablegibi tüm uygulamalar için tüm ses güçlendirme kısıtlamalarını etkinleştirir. Ayrıca bu işaret, ses düzeyi ve odak etkileşimleri içinIllegalStateExceptionhatası vererek belirgin hataları etkinleştirir. Ses çalma için yazma yöntemi sürekli olarak bir hata kodu döndürür. Açık yazma işlemleri içermeyen oynatma modlarında uygulama kilitlenir.
Uygulamanın, ses güçlendirme yaptırımı nedeniyle sessiz hatalarla karşılaşıp karşılaşmadığını belirlemek için adb dumpsys audio veya logcat kullanın. Eşleşme varsa paket adınızın önünde AudioHardening olan bir giriş görürsünüz. Mesajda level: full ifadesi varsa uygulamanız ön plan hizmeti çalıştırıyordur ancak hizmetin kullanımdayken özelliği yoktur. Mesajda level: partial ifadesi varsa uygulamanız ön plan hizmeti çalıştırmıyor demektir.
Kullanım sırasında özelliğiyle FGS'yi anlama
Genellikle ön plan hizmetleri (FGS), kullanıcı tarafından başlatılan işlemleri genişletmek için uygulama ön plandayken başlatılmalıdır. Bazı özel durumlarda uygulamaların arka plandayken ön plan hizmeti başlatmasına izin verilir. Ancak bu ön plan hizmetlerine genellikle kullanım sırasında (WIU) özellikleri verilmez.
WIU, güvenlik kapısı görevi görür. Arka planda başlatılan ön plan hizmetlerinin, kullanıcı uygulamanın etkinliğinden haberdar olmayabileceği durumlarda belirli hassas davranışlarda bulunmasını engeller. Uygulamanın konum, kamera veya mikrofon gibi hassas verilere erişmesini engeller. Ayrıca Android 17'den itibaren, genellikle görünür bir kullanıcı arayüzü bağlamı gerektiren ses API'lerini de engeller.
Aşağıda faydalı bir referans verilmiştir:
- Standart FGS: Uygulama görünür durumdayken veya arka plan etkinliği başlatma özelliği verilmişken başlatılan hizmetlere WIU erişimi verilir.
- Arka planda başlatılan ön plan hizmetleri (BFSL): Çoğu, WIU erişimi vermez. WIU izni veren birincil istisnalar, açık kullanıcı niyetini içeren etkileşimlerdir (ör. bildirim tıklamaları, widget etkileşimleri veya harici bir cihazdan gelen medya tuşu etkinlikleri).
- Sistem tarafından başlatılan FGS: Ön plan hizmetlerine, sistem sunucusu yetkilendirmesiyle (ör. Telecom Jetpack kitaplığından) veya özel işlevleri (ör.
VoiceInteractionServiceiçin) gerçekleştirmek üzere yükseltilmiş bir ön plan durumunu temsil eden sistem bağlamalarıyla başlatılırlarsa WIU erişimi verilir.
Arka plandan ön plan hizmeti başlatmayla ilgili kısıtlamalar başlıklı makaleden daha fazla bilgi edinebilirsiniz.
Etkilenen Audio API'lerin tam listesi
Ses işlevi |
Sonuç |
Etkilenen API'ler |
Ses çalma |
Oynatma sesi kapatıldı İstisna yok, API'ler tarafından sağlanan hata mesajı yok |
(NDK) Media3, Exoplayer ve Oboe gibi oynatmayı yöneten tüm istemci tarafı medya kitaplıkları da etkilenebilir. |
Ses odağı isteği |
Diğer uygulamaların ses çalma işlevi etkilenmez, odaklanma gerçekleşmez. |
|
Ses seviyesi ve zil modu API'leri |
Zil modu veya ses düzeyi üzerinde etkisi yoktur (yöntem çağrısı sessizce yoksayılır) İstisna yok, API'ler tarafından sağlanan hata mesajı yok |
|