Android 17'den itibaren ses çerçevesi, bu değişikliklerin kullanıcı tarafından kasıtlı olarak başlatılmasını sağlamak için ses çalma, ses odağı istekleri ve ses seviyesi değişikliği API'leri dahil olmak üzere arka plandaki ses etkileşimleriyle ilgili kısıtlamaları zorunlu kılar.
Android 17'de çalışan ve bu arka planda ses etkileşimlerine sahip 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ırması gerekir. Bu, uygulamanın API düzeyi 37'yi hedefleyip hedeflemediğine bakılmaksızın geçerlidir.
Bir uygulama Android 17'yi (API düzeyi 37) hedefliyorsa ek bir kısıtlama uygulanır. Uygulama arka planda çalışıyorsa kullanım sırasında (WIU) özelliklerine sahip bir ön plan hizmeti çalıştırması gerekir. (Bir ön plan hizmeti, kullanıcı tarafından başlatılan bir işleme yanıt olarak veya uygulama kullanıcıya görünürken başlatılırsa WIU özellikleri verilir.) Ancak uygulamaya exact alarm izni verildiyse ve uygulama, USAGE_ALARM özelliğine sahip ses akışlarında değişiklik yapıyorsa WIU özellikleri şartı geçerli değildir.
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 getirilmesinin amacı, istenmeden arka planda sesle ilgili hatalı deneyimlerin yaşanmasını azaltmaktır. Buna örnek olarak aşağıdakiler verilebilir:
- Ön plan hizmeti olmadan ses çalan uygulamalar dondurulabilir. Uygulamanın dondurulması kaldırıldığında, ses oynatma beklenmedik bir şekilde devam eder ve bu durum saatler sonra gerçekleşebilir.
- Ön plan hizmeti olmadan ses çalan uygulamalar, çeşitli çalışma kısıtlamalarıyla karşılaşıyordu. Bu durum, ses performansının kesintili olmasına neden oluyordu.
- Oynatma, etkinlik yaşam döngüsünden ayrıldığında oynatma oturumunun veya odak etkinliklerinin sızmasına neden olabilir. Bu durumda, kullanıcı oynatmayı durduramaz.
Geliştiricilerin uygulamalarını test etmelerini ve kasıtlı ses kullanım alanlarından olumsuz etkilenenler varsa davranış değişikliğiyle ilgili geri bildirimde bulunmalarını öneririz. Lütfen bu Android 17 uygulama uyumluluğu sorun izleyicisini kullanarak sorunları bildirin.
Etkilenen arka plan sesi 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 sağlamayı amaçlayıp amaçlamadığını belirleyin.
Uygulamanız yalnızca ses çalmak veya Resim İçinde Resim (PiP) modu kullanmak da dahil olmak üzere kullanıcıya görünür bir etkinlik gösterirken ses API'lerinden yararlanmak istiyorsa bu değişikliklerden etkilenmez.
Uygulamanızda görüntülü görüşme uygulamaları da dahil olmak üzere VOIP işlevselliği sağlanıyorsa sesin başarılı bir şekilde kaydedilmesi için oynatma ile ilgili yeni şartları (genellikle önerilen telekom API'leri kullanılarak) karşılaması gerekir. Bu nedenle, uygulamanızın bu değişiklikten etkilenme olasılığı düşüktür.
Uygulamanız ekran kapalıyken veya etkinliğiniz görünür değilken (en sık müzik yayın uygulamalarında veya podcast uygulamalarında görülür) ses çalmaya devam etmeyi amaçlıyorsa uygulamanızın arka planda ses işlevi sağladığı kabul edilir ve yeni şartları karşılaması gerekir.
Arka plan sesinin etkilemesi muhtemel 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 devre dışı bırakılabilir.
Örneğin, uygulamanız BOOT_COMPLETE yanıtı olarak bir ön plan hizmeti başlatırsa ve sesle etkileşimde bulunmaya çalışırsa bu işlem engellenir.
Etkiyi azaltmak için en iyi arka plan sesi uygulamaları
Arka planda ses çalmayı yönetmek için media3 jetpack kitaplığının
MediaSessionServicebileşenini kullanın.Bu durumda, kitaplık oynatma yaşam döngüsünün yönetilmesine yardımcı olduğundan uygulamanızın arka planda sağlamlaştırmadan etkilenmesi olası değildir.
Media3 kitaplığını kullanmıyorsanız
mediaPlaybackFGS'yi manuel olarak başlatmanız gerekir. Arka planda ses çalma olasılığı varsa uygulama ön plandayken her zaman ön plan hizmeti başlatın.Örneğin, uygulamanız normalde yalnızca ön planda çalışan ancak ekran kapalıyken oynatmaya devam etme özelliği içeren bir yayın uygulamasıysa kullanıcı tarafından başlatılan oynatma tetikleyicisi gerçekleştiğinde uygulamanız yine de bir ön plan hizmeti başlatmalıdır.
Bu işlem, ön plan hizmetinin WIU özellikleri ile başlatılmasını sağlar.
10 dakikadan kısa süren geçici arızalar sırasında
mediaPlaybackFGS'yi etkin tutun.Uygulamanızda geçici bir hata varsa (ör. ağ etkinliği nedeniyle arabelleğe alma sorunu) veya geçici bir kesinti bekleniyorsa (ör.
AUDIOFOCUS_LOSS_TRANSIENT), oynatma amacı devam etmelidir. Bu nedenle FGS'niz etkin kalmalıdır.Oynatma sonunda ön plan hizmetini durdurun ve oynatmayı yalnızca kullanıcı açıkça devam ettirirse yeniden başlatın.
Oynatmayı sonlandırmak için kalıcı bir sinyal (ör. içerik tamamlanmış, otomatik oynatma yok,
AUDIOFOCUS_LOSS, UMO'dan gelen bir duraklatma etkinliği veya bir medya anahtarı 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 bu işlemler, kullanıcının istediği arka plan ses etkileşimini "tamamlama" anlayışına karşılık gelir. Bu işlemi yaptıktan sonra uygulamanızın artık arka planda ses etkileşimi özellikleri olmaz.Ardından, kullanıcı oynatmayı açıkça devam ettirirse (ör. uygulamanızın kullanıcı arayüzü veya Universal Media Object oynatma düğmesi aracılığıyla) ses oynatmayı başlatma amacı geri döner ve yeni bir ön plan hizmeti başlatılır.
Ses oynatma davranışını adb shell komutlarıyla test edin.
Değişiklikleri test etme
Aşağıdaki ADB komutunu çalıştırarak uygulamanızın Android 17 veya sonraki sürümlerin (Beta 3'ten itibaren) yüklü olduğu cihazlardaki uygunluğ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üvenliği 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 uygulanır. Ayrıca, uygulama alarm akışlarında değişiklik yapıyor ve tam alarm iznine sahip olsa bile bu koşul zorunlu tutulur.disable: Tüm ses sağlamlaştırma kısıtlamalarını devre dışı bırakır.throw:enablegibi tüm uygulamalar için tüm ses sağlamlaştırma kısıtlamalarını etkinleştirir. Ayrıca bu işaret, ses ve odak etkileşimleri içinIllegalStateExceptionatarak yüksek hataları etkinleştirir. Ses çalma için yazma yöntemi sürekli olarak bir hata kodu döndürüyor. Açıkça yazma işlemi yapılmayan oynatma modlarında uygulama kilitleniyor.
Uygulamanın, ses sağlamlaştırma zorunlu kılma nedeniyle sessiz hatalarla karşılaşıp karşılaşmadığını belirlemek için adb dumpsys audio veya logcat simgesini kullanın. Bu durumda, paket adınızla birlikte AudioHardening önekli bir giriş gösterilir. Mesaj level: full içeriyorsa uygulamanız bir ön plan hizmeti çalıştırıyor ancak hizmetin kullanım sırasında özelliği yok. İleti level: partial içeriyorsa uygulamanız hiç ön plan hizmeti çalıştırmıyor demektir.
Kullanım sırasında işlevselliği ile FGS'yi anlama
Genellikle, kullanıcı tarafından başlatılan işlemleri uzatmak için bir uygulama ön plandayken ön plan hizmetleri (FGS) başlatılmalıdır. Bazı özel durumlarda, uygulamaların arka planda çalışırken ö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. Kullanıcı, uygulamanın etkinliğinin farkında olmayabileceği durumlarda, arka planda başlatılan ön plan hizmetlerinin belirli hassas davranışlarda bulunmasını engeller. Bu izin, 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.
İşinize yarayabilecek bir referans:
- Standart ön plan hizmetleri: Uygulama görünürken veya arka plan etkinliği başlatma özelliği verilirken başlatılan hizmetlere WIU erişimi verilir.
- Arka planda başlatılan ön plan hizmeti (BFSL): Çoğu, WIU erişimi vermez. WIU'nun verildiği temel istisnalar, açık kullanıcı niyeti içeren etkileşimlerdir. Örneğin, bildirim tıklamaları, widget etkileşimleri veya harici bir cihazdan gelen medya tuşu etkinlikleri.
- Sistem tarafından başlatılan ön plan hizmetleri: Ön plan hizmetleri, sistem sunucusu temsilcisi tarafından (ör. Telecom Jetpack kitaplığından) veya özel işlevler gerçekleştirmek için yükseltilmiş bir ön plan durumunu temsil eden sistem bağlamaları tarafından (ör.
VoiceInteractionServiceiçin) başlatılırsa WIU erişimi verilir.
Daha fazla bilgiyi Arka plandan ön plan hizmeti başlatmayla ilgili kısıtlamalar başlıklı makalede bulabilirsiniz.
Etkilenen ses API'lerinin tam listesi
Ses işlevi |
Sonuç |
Etkilenen API'ler |
Ses çalma |
Oynatma sesi kapatıldı İstisna yok, hiçbir API tarafından hata mesajı sağlanmadı |
(NDK) Oynatmayı yöneten tüm istemci tarafı medya kitaplıkları (ör. media3, Exoplayer ve Oboe) da bu durumdan etkilenebilir. |
Ses odağı isteği |
İadeler Diğer uygulamaların ses çalması etkilenmez, odaklanma gerçekleşmez. |
|
Ses ve zil sesi modu API'leri |
Zil modunu veya ses düzeyini etkilemez (yöntem çağrısı sessizce yok sayılır). İstisna yok, hiçbir API tarafından hata mesajı sağlanmadı |
|