Android 17'den itibaren ses çerçevesi, kullanıcının bu değişiklikleri kasıtlı olarak başlatması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.
Bir uygulama geliştirici, sesi görünür bir etkinlik olmadan kontrol etmek istiyorsa uygulamanın kullanımdayken (WIU) özellikleriyle başlatılmış bir ön plan hizmeti (SHORT_SERVICE türünde olmayan) olduğundan emin olmalıdır. Bir ön plan hizmeti, MediaSessionEvent yanıt olarak veya uygulama kullanıcıya görünürken başlatılırsa WIU özellikleri verilir.
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 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 ses API'lerini kullanmak amacıyla kullanıcıya görünür bir etkinlik gösteriyorsa (Resim İçinde Resim (PiP) modunu kullanmak dahil) 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 durumdan etkilenme olasılığı düşüktür.
Uygulamanız, ekran kapalıyken veya kullanıcı etkinliğinizi tamamen kapattıktan sonra ses çalmaya devam etmeyi amaçlıyorsa (bu durum en çok müzik akışı 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 devre dışı bırakılabilir.
Örneğin, uygulamanız BOOT_COMPLETE yanıtı olarak bir ön plan hizmeti başlatırsa ve sesle etkileşim kurmaya ç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 güvenlik önlemlerinden 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 video akışı 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 artık arka planda ses etkileşimi özelliklerine sahip 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.
Android 16 ve Android 17'deki test değişiklikleri
Bu özellik, Android 16'dan itibaren "uyarı" düzeyinde uygulanmaktadır. Bu sayede uygulamalar, arka planda ses güvenliği yaptırımını manuel olarak test etmek için adb shell cmd audio
set-enable-hardening kullanabilir.
Android 16 çalıştıran cihazlarda zorunlu kılmayı etkinleştirmek için aşağıdaki komutu çalıştırın:
adb shell cmd audio set-enable-hardening 1
Android 17 çalıştıran cihazlarda zorunlu kılmayı devre dışı bırakmak için aşağıdaki komutu çalıştırın:
adb shell cmd audio set-enable-hardening 0
Ayrıca, ses güvenliği zorunluluğu nedeniyle uygulamada sessiz hatalar oluşup oluşmadığını belirlemek için logcat veya adb komutunu adb dumpsys audio kullanmanızı öneririz. Bu durumda, günlükte paket adınızla birlikte AudioHardening önekli bir giriş bulunur.
Kullanımdayken işlevine sahip 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ının uygulamanın etkinliğinden haberdar olmayabileceği durumlarda, arka planda başlatılan ön plan hizmetlerinin belirli hassas davranışlarda bulunmasını engeller. Bu özellik, 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ı aşağıda bulabilirsiniz:
- 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 ön plan hizmetini başlattı: Sistem sunucusu temsilini (ör. Telecom Jetpack kitaplığını kullanarak) kullanmaya başlayan ön plan hizmetlerine 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 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ı |
|