Udostępnianie wejścia audio

Wejście audio zwykle pochodzi z wbudowanego mikrofonu, mikrofonu zewnętrznego lub interfejsu audio podłączonego do urządzenia. Dźwięk może też pochodzić z rozmowy telefonicznej.

Czasami co najmniej dwie aplikacje chcą „rejestrować” to samo wejście audio. Mogą wykonywać różne zadania. Na przykład niektóre aplikacje odbierające dźwięk mogą używać funkcji „nagrywanie” (jak prosty dyktafon), natomiast inne aplikacje „słuchaj” (takie jak Asystent Google czy usługa ułatwień dostępu reagujące na polecenia głosowe).

W obu przypadkach aplikacje te chcą odbierać dane wejściowe audio. Na tej stronie używamy terminu „rejestrowanie” niezależnie od tego, czy aplikacja nagrywa, czy tylko słucha.

Jeśli co najmniej 2 aplikacje chcą rejestrować dźwięk w tym samym czasie, może wystąpić problem z przesłaniem sygnału audio z tego samego źródła do wszystkich. Na tej stronie opisujemy, jak system Android współużytkuje dane dźwiękowe z różnych aplikacji, które rejestrują dźwięk.

Działanie systemu sprzed Androida 10

Wcześniej w Androidzie 10 wejściowy strumień audio mógł przechwytywać tylko jedna aplikacja naraz. Jeśli jakaś aplikacja nagrywała lub słuchała już dźwięku, aplikacja może utworzyć obiekt AudioRecord, ale przy wywołaniu AudioRecord.startRecording() będzie zwracany błąd, a nagrywanie nie rozpocznie się.

Wyjątkiem od tej reguły było sytuacja, w której aplikacja z uprawnieniami (np. Asystent Google lub usługa ułatwień dostępu) miała uprawnienie android.permission.CAPTURE_AUDIO_HOTWORD i używała źródła dźwięku typu HOTWORD. W takim przypadku inna aplikacja może rozpocząć nagrywanie. W takim przypadku aplikacja z podwyższonymi uprawnieniami została zamknięta, a nowa aplikacja przechwyciła dane wejściowe.

W Androidzie 9 wprowadzono jeszcze jedną zmianę: tylko aplikacje działające na pierwszym planie (lub usługa na pierwszym planie) mogły rejestrować wejście audio. Gdy aplikacja bez usługi na pierwszym planie i komponentu UI na pierwszym planie zaczęła rejestrować dane, aplikacja nadal działała, ale była wyciszona, nawet jeśli była to jedyna aplikacja rejestrująca dźwięk.

Działanie Androida 10

W Androidzie 10 obowiązuje zasada „kto pierwszy, ten lepszy”. Gdy aplikacja zacznie rejestrować dźwięk, żadna inna aplikacja nie będzie miała dostępu do wejścia audio, dopóki aplikacja, która rejestruje dźwięk, nie zostanie zatrzymana.

Android 10 stosuje schemat priorytetu, który może przełączać wejściowy strumień audio między uruchomionymi aplikacjami. W większości przypadków, jeśli nowa aplikacja pobierze dane dźwiękowe, aplikacja, która wcześniej nagrywała dane, będzie nadal działać, ale będzie wyciszona. W niektórych przypadkach system może nadal odtwarzać dźwięk w obu aplikacjach. Poniżej omawiamy różne scenariusze udostępniania.

Ten schemat jest podobny do tego, w jaki sposób funkcje audio rywalizują z wieloma aplikacjami, które rywalizują o użycie wyjścia audio. Skupienie się na dźwięku jest jednak zarządzane za pomocą zautomatyzowanych żądań zdobywania i zwalniania funkcji. Opisany tu schemat przełączania danych wejściowych jest oparty na zasadzie priorytetu, która jest stosowana automatycznie za każdym razem, gdy nowa aplikacja zacznie rejestrować dźwięk.

Aby rejestrować dźwięk, Android rozróżnia 2 rodzaje aplikacji:

  • „Zwykłe” aplikacje są instalowane przez użytkownika.
  • Aplikacje z podwyższonymi uprawnieniami są fabrycznie zainstalowane na urządzeniu. Obejmuje to Asystenta Google i wszystkie usługi ułatwień dostępu.

Poza tym aplikacja jest traktowana inaczej, jeśli używa „poufnego źródła dźwięku”: CAMCORDER lub VOICE_COMMUNICATION.

Oto reguły określania priorytetów przy używaniu i udostępnianiu wejścia audio:

  • Aplikacje z podwyższonymi uprawnieniami mają wyższy priorytet niż zwykłe aplikacje.
  • Aplikacje, w których interfejs użytkownika jest widoczny na pierwszym planie, mają wyższy priorytet niż aplikacje działające w tle.
  • Aplikacje rejestrujące dźwięk ze źródła chroniącego prywatność mają wyższy priorytet niż aplikacje, które z niego nie korzystają.
  • Dwie zwykłe aplikacje nigdy nie są w stanie rejestrować dźwięku w tym samym czasie.
  • W niektórych sytuacjach aplikacja z podwyższonymi uprawnieniami może udostępniać wejście audio innej aplikacji.
  • Jeśli 2 aplikacje działające w tle mają ten sam priorytet do nagrywania dźwięku, to ostatnia uruchomiona ma wyższy priorytet.

Scenariusze rozmów

Gdy 2 aplikacje próbują rejestrować dźwięk, obie mogą być w stanie odbierać sygnał wejściowy lub jedna z nich może Cię wyciszyć.

Dostępne są 4 główne scenariusze:

  • Asystent + zwykła aplikacja
  • Usługa ułatwień dostępu + zwykła aplikacja
  • Dwie zwykłe aplikacje
  • Połączenie głosowe + zwykła aplikacja

Asystent + zwykła aplikacja

Asystent ma status aplikacji z podwyższonymi uprawnieniami, ponieważ jest wstępnie zainstalowany i ma przypisaną rolę RoleManager.ROLE_ASSISTANT. Wszystkie inne wstępnie zainstalowane aplikacje, które mają tę rolę, są traktowane podobnie.

Android udostępnia wejściowy dźwięk zgodnie z tymi regułami:

  • Asystent może odbierać dźwięk (niezależnie od tego, czy na pierwszym planie, czy w tle), chyba że nagrywa już inne aplikacje korzystające ze źródła dźwięku poufnego.

  • Aplikacja odbiera dźwięk, chyba że Asystent ma widoczny komponent UI u góry ekranu.

Pamiętaj, że obie aplikacje odtwarzają dźwięk tylko wtedy, gdy Asystent działa w tle, a druga aplikacja nie rejestruje dźwięku ze źródła dźwięku wymagającego ochrony prywatności.

Usługa ułatwień dostępu + zwykła aplikacja

AccessibilityService wymaga ścisłej deklaracji.

Android udostępnia wejściowy dźwięk zgodnie z tymi regułami:

  • Jeśli interfejs usługi znajduje się na górze, zarówno usługa, jak i aplikacja odbiera dane dźwiękowe. Można w ten sposób sterować rozmowami głosowymi i nagrywaniem filmów za pomocą poleceń głosowych.

  • Jeśli usługa nie znajduje się na samej górze, jest traktowane jak zwykłe zgłoszenie z 2 aplikacjami poniżej.

Dwie zwykłe aplikacje

Gdy 2 aplikacje nagrywają jednocześnie obraz, tylko jedna z nich otrzymuje dźwięk, a druga wycisza.

Android udostępnia wejściowy dźwięk zgodnie z tymi regułami:

  • Jeśli żadna z aplikacji nie chroni prywatności, aplikacja z interfejsem na górze odbiera dźwięk. Jeśli żadna z aplikacji nie ma interfejsu użytkownika, dźwięk odbiera ta, która rozpoczęła przechwytywanie jako ostatnia.
  • Jeśli jedna z aplikacji chroni prywatność, odbiera dźwięk, a druga wycisza, nawet jeśli ma interfejs użytkownika lub rozpoczęła nagrywanie niedawno.
  • Jeśli obie aplikacje szanują prywatność, to aplikacja, która ostatnio zaczęła przechwytywać dźwięk, odbiera dźwięk, a druga wycisza.

Połączenie głosowe + zwykła aplikacja

Połączenie głosowe jest aktywne, jeśli tryb audio zwracany przez AudioManager.getMode() to MODE_IN_CALL lub MODE_IN_COMMUNICATION.

Android udostępnia wejściowy dźwięk zgodnie z tymi regułami:

Sposób działania Androida 11

Android 11 (poziom interfejsu API 30) jest zgodny ze schematem priorytetów Androida 10 opisanym powyżej. Zawiera też nowe metody w AudioRecord, MediaRecorder i AAudioStream, które umożliwiają lub wyłączają możliwość równoczesnego rejestrowania dźwięku niezależnie od wybranego przypadku użycia.

Nowe metody to:

Gdy setPrivacySensitive() ma wartość true, przechwytywanie jest prywatne i nawet Asystent z podwyższonymi uprawnieniami nie może rejestrować danych w tym samym czasie. To ustawienie zastępuje domyślne działanie zależne od źródła dźwięku. Na przykład VOICE_COMMUNICATION jest domyślnie prywatne, ale UNPROCESSED nie jest.

Zmiany konfiguracji

Gdy kilka aplikacji rejestruje dźwięk jednocześnie, tylko jedna lub dwie są „aktywne” (odbierają dźwięk), a pozostałe są wyciszone (odbierają ciszę). Gdy aktywne aplikacje się zmieniają, platforma audio może ponownie skonfigurować ścieżki audio zgodnie z tymi regułami:

  • Urządzenie wejściowe audio każdej aktywnej aplikacji może się zmienić (np. z wbudowanego mikrofonu na podłączony zestaw słuchawkowy Bluetooth).
  • Włączone jest wstępne przetwarzanie powiązane z aktywną aplikacją o najwyższym priorytecie. Pozostałe przetwarzanie wstępne jest ignorowane.

Ponieważ aktywna aplikacja może zostać wyciszona, gdy aktywna będzie aplikacja o wyższym priorytecie, możesz zarejestrować obiekt AudioManager.AudioRecordingCallback w obiekcie AudioRecord lub MediaRecorder, aby otrzymywać powiadomienia o zmianie konfiguracji. Możliwe zmiany:

  • Rejestruj zdjęcia z wyciszonym lub wyłączonym dźwiękiem
  • Zmieniono urządzenie
  • Zmieniono wstępne przetwarzanie
  • Zmiany właściwości strumienia (częstotliwość próbkowania, maska kanału, format próbki)

Przed rozpoczęciem przechwytywania musisz wywołać metodę AudioRecord.registerAudioRecordingCallback(). Wywołanie zwrotne jest wykonywane tylko wtedy, gdy aplikacja odbiera dźwięk i wtedy nastąpi zmiana.

Metoda onRecordingConfigChanged() zwraca wartość AudioRecordingConfiguration, która zawiera aktualny stan zapisu dźwięku. Aby poznać tę zmianę, użyj tych metod:

isClientSilenced()
Zwraca wartość „prawda”, jeśli dźwięk zwracany klientowi jest obecnie wyciszony ze względu na zasadę przechwytywania.
getAudioDevice()
Zwraca aktywne urządzenie audio.
getEffects()
Zwraca aktywny efekt wstępnego przetwarzania. Pamiętaj, że aktywny efekt może nie być taki sam jak zwrócony przez getClientEffects(), jeśli klient nie jest aktywną aplikacją o najwyższym priorytecie.
getFormat()
Zwraca właściwości strumienia. Pamiętaj, że rzeczywiste dane audio odbierane przez klienta zawsze są zgodne z wymaganym formatem zwracanym przez getClientFormat(). Platforma automatycznie przeprowadza niezbędną ponowne próbkowanie oraz konwersję kanału i formatu z formatu używanego w interfejsie sprzętowym na format określony przez klienta.
AudioRecord.getActiveRecordingConfiguration()
Zwraca aktywną konfigurację nagrywania.

Aby uzyskać ogólny wgląd w wszystkie nagrania aktywne na urządzeniu, zadzwoń pod numer AudioManager.getActiveRecordingConfigurations().