Zwiększanie bezpieczeństwa dźwięku w tle

Od Androida 17 platforma audio wymusza ograniczenia dotyczące interakcji audio w tle, w tym odtwarzania dźwięku, żądań skupienia dźwięku i interfejsów API zmiany głośności, aby mieć pewność, że te zmiany są inicjowane celowo przez użytkownika.

Jeśli deweloper aplikacji chce sterować dźwiękiem bez widocznej aktywności, powinien zadbać o to, aby aplikacja miała usługę działającą na pierwszym planie (która nie jest typu SHORT_SERVICE) uruchomioną z uprawnieniami podczas używania. Usługa działająca na pierwszym planie uzyskuje uprawnienia do korzystania z WIU, jeśli została uruchomiona w odpowiedzi na MediaSessionEvent lub gdy aplikacja jest widoczna dla użytkownika.

Jeśli aplikacja spróbuje wywołać interfejsy API audio, gdy nie znajduje się w prawidłowym cyklu życia, interfejsy API odtwarzania dźwięku i zmiany głośności zakończą działanie bez zgłaszania wyjątku ani wyświetlania komunikatu o błędzie. Interfejs API ostrości dźwięku zwraca kod wyniku AUDIOFOCUS_REQUEST_FAILED.

Wprowadzenie tych ograniczeń ma na celu zmniejszenie liczby przypadkowych problemów z dźwiękiem w tle. Oto kilka przykładów:

  • Aplikacje odtwarzające dźwięk bez usługi na pierwszym planie mogą zostać zamrożone. Gdy aplikacja zostanie odblokowana, nieoczekiwanie wznawia odtwarzanie dźwięku, potencjalnie po kilku godzinach.
  • Aplikacje odtwarzające dźwięk bez usługi na pierwszym planie były objęte różnymi ograniczeniami, co powodowało przerywane odtwarzanie dźwięku.
  • Odtwarzanie jest odłączone od cyklu życia aktywności, co może powodować wyciek sesji odtwarzania lub wyciek zdarzeń związanych z fokusem, które są kontynuowane bez możliwości zatrzymania odtwarzania przez użytkownika.

Zachęcamy deweloperów do testowania aplikacji i przesyłania opinii na temat zmiany zachowania, jeśli ma ona negatywny wpływ na zamierzone przypadki użycia dźwięku. Wszelkie problemy zgłaszaj za pomocą tego narzędzia do śledzenia problemów z kompatybilnością aplikacji z Androidem 17.

Określanie przypadków użycia dźwięku w tle, na które ma to wpływ

Sprawdź implementację odtwarzania dźwięku i określ, czy aplikacja ma zapewniać funkcję interakcji z dźwiękiem w tle nawet w określonych okolicznościach.

Jeśli Twoja aplikacja ma odtwarzać dźwięk lub korzystać z interfejsów API audio tylko wtedy, gdy wyświetla aktywność widoczną dla użytkownika, w tym w trybie obrazu w obrazie, nie ma to wpływu na te zmiany.

Jeśli Twoja aplikacja udostępnia funkcje VoIP, w tym aplikacje do rozmów wideo, musi już spełniać wymagania wprowadzane w przypadku odtwarzania (zwykle poprzez korzystanie z rekomendowanych interfejsów API telekomunikacyjnych), aby móc nagrywać dźwięk. W związku z tym prawdopodobnie nie będzie to miało na nią wpływu.

Jeśli Twoja aplikacja ma odtwarzać dźwięk, gdy ekran jest wyłączony lub gdy użytkownik całkowicie zamknie aktywność (co najczęściej występuje w przypadku aplikacji do strumieniowego przesyłania muzyki lub podcastów), uznaje się, że zapewnia ona funkcję odtwarzania dźwięku w tle, i musi spełniać nowe wymagania.

Scenariusze dotyczące dźwięku w tle, na które prawdopodobnie wpłynie ta zmiana

Jeśli aplikacja nie działa zgodnie z modelem kontynuowania interakcji głosowej rozpoczętej, gdy była otwarta, lub w odpowiedzi na wyraźne działanie użytkownika, jej funkcje prawdopodobnie zostaną wyciszone.

Jeśli na przykład aplikacja uruchamia usługę działającą na pierwszym planie w odpowiedzi na BOOT_COMPLETE i próbuje wchodzić w interakcje z dźwiękiem, zostanie ona wyciszona.

Sprawdzone metody dotyczące dźwięku w tle, które pozwalają ograniczyć wpływ na wyniki

  • Użyj komponentu MediaSessionService biblioteki Jetpack media3, aby zarządzać odtwarzaniem dźwięku w tle.

    W takim przypadku Twoja aplikacja prawdopodobnie nie będzie miała problemów z działaniem w tle, ponieważ biblioteka pomaga w zarządzaniu cyklem życia odtwarzania.

  • Jeśli nie korzystasz z biblioteki media3, musisz ręcznie uruchomić mediaPlayback usługę na pierwszym planie. Zawsze uruchamiaj usługę na pierwszym planie, gdy aplikacja działa na pierwszym planie, jeśli może wystąpić dźwięk w tle.

    Jeśli na przykład Twoja aplikacja to aplikacja do strumieniowego przesyłania wideo, która zwykle działa tylko na pierwszym planie, ale zawiera funkcję umożliwiającą kontynuowanie odtwarzania przy wyłączonym ekranie, to po wywołaniu przez użytkownika odtwarzania aplikacja powinna nadal uruchamiać usługę na pierwszym planie.

    Dzięki temu usługa działająca na pierwszym planie zostanie uruchomiona z możliwościami WIU.

  • Utrzymuj aktywność mediaPlayback FGS podczas przejściowych awarii trwających krócej niż 10 minut.

    Jeśli w aplikacji wystąpi przejściowa awaria, np. problem z buforowaniem spowodowany aktywnością sieciową, lub wystąpi spodziewana przejściowa przerwa, np. AUDIOFOCUS_LOSS_TRANSIENT, odtwarzanie powinno być kontynuowane. Dlatego usługa FGS powinna pozostać aktywna.

  • Zatrzymaj usługę na pierwszym planie po zakończeniu odtwarzania i uruchom odtwarzanie ponownie tylko wtedy, gdy użytkownik wyraźnie wznowi odtwarzanie.

    W przypadku trwałego sygnału zakończenia odtwarzania (np. gdy treść jest kompletna i nie ma autoodtwarzania, wystąpi AUDIOFOCUS_LOSS, zdarzenie wstrzymania z UMO lub zdarzenie klawisza multimedialnego) lub nieodwracalnej awarii aplikacja powinna zakończyć interakcję audio, zatrzymać usługę na pierwszym planie i zakończyć sesję multimedialną. Wszystkie te czynności odpowiadają koncepcji użytkownika dotyczącej „zakończenia” interakcji z żądanym dźwiękiem w tle. Po wykonaniu tej czynności aplikacja nie będzie już mogła wchodzić w interakcje z dźwiękiem w tle.

    Jeśli użytkownik wznowi odtwarzanie, np. za pomocą interfejsu aplikacji lub przycisku odtwarzania w uniwersalnym obiekcie multimedialnym, intencja rozpoczęcia odtwarzania dźwięku powinna powrócić, co spowoduje uruchomienie nowej usługi na pierwszym planie.

  • Testowanie działania odtwarzania dźwięku za pomocą poleceń adb shell.

Testowanie zmian na Androidzie 16 i 17

Ta funkcja jest już zaimplementowana na poziomie „ostrzeżenie” od Androida 16. Oznacza to, że aplikacje mogą używać adb shell cmd audio set-enable-hardening do ręcznego testowania egzekwowania zasad dotyczących wzmocnienia ochrony dźwięku w tle.

Aby włączyć egzekwowanie na urządzeniach z Androidem 16, uruchom to polecenie:

adb shell cmd audio set-enable-hardening 1

Aby wyłączyć egzekwowanie na urządzeniach z Androidem 17, uruchom to polecenie:

adb shell cmd audio set-enable-hardening 0

Zalecamy też użycie logcat lub polecenia adb adb dumpsys audio, aby sprawdzić, czy w aplikacji wystąpiły ciche błędy spowodowane wymuszaniem zabezpieczeń dźwięku. Jeśli tak, w logu pojawi się wpis z prefiksem AudioHardening i nazwą pakietu.

Informacje o usłudze FGS z funkcją używania podczas korzystania z aplikacji

Usługi na pierwszym planie muszą być uruchamiane, gdy aplikacja jest na pierwszym planie, aby przedłużyć operacje zainicjowane przez użytkownika. W niektórych przypadkach aplikacje mogą uruchamiać usługę na pierwszym planie, gdy działają w tle. Jednak te usługi działające na pierwszym planie zwykle nie mają uprawnień obowiązujących podczas używania.

WIU działa jak brama zabezpieczająca – uniemożliwia usługom działającym na pierwszym planie uruchamianym w tle wykonywanie określonych działań wymagających dostępu do informacji wrażliwych, gdy użytkownik może nie być świadomy aktywności aplikacji. Uniemożliwia to aplikacji dostęp do danych wrażliwych, takich jak lokalizacja, aparat czy mikrofon. Od Androida 17 blokuje też interfejsy API audio, które zwykle wymagają widocznego kontekstu interfejsu.

Oto przydatne informacje:

  • Standardowa usługa działająca na pierwszym planie: usługi uruchamiane, gdy aplikacja jest widoczna lub ma możliwość uruchamiania aktywności w tle, mają dostęp do WIU.
  • Usługi działające na pierwszym planie uruchamiane w tle (BFSL): większość nie przyznaje dostępu do WIU. Główne wyjątki, które przyznają WIU, to interakcje obejmujące wyraźny zamiar użytkownika, np. kliknięcia powiadomień, interakcje z widżetami lub zdarzenia klawiszy multimedialnych z urządzenia zewnętrznego.
  • Usługa działająca na pierwszym planie została uruchomiona przez system: usługa działająca na pierwszym planie, która zaczęła korzystać z delegowania do serwera systemowego (np. za pomocą biblioteki Jetpack Telecom), otrzymuje dostęp do WIU.

Więcej informacji znajdziesz w artykule Ograniczenia dotyczące uruchamiania usługi na pierwszym planie podczas działania w tle.

Pełna lista interfejsów Audio API, których dotyczy problem

Funkcja audio

Wynik

Interfejsy API, których dotyczy problem

Odtwarzanie dźwięku

Odtwarzanie jest wyciszone

Brak wyjątków, żaden interfejs API nie podaje komunikatu o błędzie

AudioTrack.write()

(NDK) AAudioStream_write

OpenSL ES na Androida

Może to też mieć wpływ na biblioteki multimediów po stronie klienta, które zarządzają odtwarzaniem, takie jak media3, Exoplayer i Oboe.

Prośba o aktywność audio

Zwroty AUDIOFOCUS_REQUEST_FAILED

Nie ma wpływu na odtwarzanie dźwięku w innych aplikacjach, nie uzyskuje fokusu

AudioManager.requestAudioFocus()

Interfejsy API głośności i trybu dzwonka

Brak wpływu na tryb dzwonka ani głośność (wywołanie metody jest ignorowane)

Brak wyjątków, żaden interfejs API nie podaje komunikatu o błędzie

AudioManager.setStreamVolume()

AudioManager.setStreamMute()

AudioManager.adjustStreamVolume()

AudioManager.adjustVolume()

AudioManager.adjustSuggestedStreamVolume()

AudioManager.setRingerMode()