Udostępnianie wejścia audio

Dźwięk jest zwykle rejestrowany przez wbudowany mikrofon, mikrofon zewnętrzny lub interfejs audio podłączony do urządzenia. Dane wejściowe audio mogą też pochodzić z rozmowy telefonicznej.

Czasami co najmniej 2 aplikacje mogą chcieć „przechwycić” te same dane wejściowe audio. Mogą wykonywać różne zadania. Na przykład niektóre aplikacje, które odbierają dźwięk, mogą go „nagrywać” (jak prosty dyktafon), podczas gdy inne mogą go „nasłuchiwać” (jak Asystent Google lub usługa ułatwień dostępu, które reagują na polecenia głosowe).

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

Jeśli co najmniej 2 aplikacje chcą jednocześnie przechwytywać dźwięk, może wystąpić problem z dostarczeniem sygnału audio z tego samego źródła do wszystkich z nich. Na tej stronie opisano, jak system Android udostępnia dane wejściowe audio wielu aplikacjom, które przechwytują dźwięk.

Działanie przed Androidem 10

Przed Androidem 10 wejściowy strumień audio mógł być przechwytywany tylko przez jedną aplikację naraz. Jeśli jakaś aplikacja już nagrywała lub nasłuchiwała dźwięk, Twoja aplikacja mogła utworzyć obiekt AudioRecord, ale po wywołaniu metody AudioRecord.startRecording() zwracany był błąd i nagrywanie się nie rozpoczynało.

Wyjątkiem od tej reguły była sytuacja, gdy uprzywilejowana aplikacja (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 uprzywilejowana została zamknięta, a nowa aplikacja przechwyciła dane wejściowe.

W Androidzie 9 dodano jeszcze jedną zmianę: tylko aplikacje działające na pierwszym planie (lub usługi działające na pierwszym planie) mogły przechwytywać dane wejściowe audio. Gdy aplikacja bez usługi na pierwszym planie lub komponentu interfejsu na pierwszym planie zaczynała nagrywać, aplikacja nadal działała, ale nagrywała ciszę, nawet jeśli była jedyną aplikacją, która w tym czasie nagrywała dźwięk.

Działanie Androida 10

W systemach starszych niż Android 10 obowiązuje zasada „kto pierwszy, ten lepszy”. Gdy aplikacja zacznie nagrywać dźwięk, żadna inna aplikacja nie będzie miała dostępu do wejścia audio, dopóki aplikacja nagrywająca dźwięk nie przestanie działać.

Android 10 narzuca schemat priorytetów, który może przełączać wejściowy strumień audio między aplikacjami podczas ich działania. W większości przypadków, gdy nowa aplikacja przejmie wejście audio, aplikacja, która wcześniej nagrywała, będzie nadal działać, ale będzie otrzymywać ciszę. W niektórych przypadkach system może nadal odtwarzać dźwięk w obu aplikacjach. Poniżej opisujemy różne scenariusze udostępniania.

Ten schemat jest podobny do sposobu, w jaki fokus audio obsługuje wiele aplikacji rywalizujących o korzystanie z wyjścia audio. Jednak fokusem audio zarządza się za pomocą automatycznych żądań uzyskania i zwolnienia fokusu, a opisany tutaj schemat przełączania danych wejściowych opiera się na zasadach priorytetyzacji, które są stosowane automatycznie, gdy nowa aplikacja zaczyna nagrywać dźwięk.

Na potrzeby przechwytywania dźwięku 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 źródła dźwięku „związanego z prywatnością”: CAMCORDER lub VOICE_COMMUNICATION.

Reguły priorytetów dotyczące używania i udostępniania wejścia audio są następujące:

  • Aplikacje uprzywilejowane mają wyższy priorytet niż zwykłe aplikacje.
  • Aplikacje z widocznymi interfejsami na pierwszym planie mają wyższy priorytet niż aplikacje działające w tle.
  • Aplikacje, które przechwytują dźwięk ze źródła związanego z prywatnością, mają wyższy priorytet niż aplikacje, które tego nie robią.
  • Dwie zwykłe aplikacje nigdy nie mogą nagrywać dźwięku jednocześnie.
  • W niektórych sytuacjach aplikacja uprzywilejowana może udostępniać dane wejściowe audio innej aplikacji.
  • Jeśli 2 aplikacje działające w tle o tym samym priorytecie nagrywają dźwięk, wyższy priorytet ma ta, która została uruchomiona jako ostatnia.

Scenariusze udostępniania

Gdy 2 aplikacje próbują przechwycić dźwięk, obie mogą odbierać sygnał wejściowy lub jedna z nich może odbierać ciszę.

Istnieją 4 główne scenariusze:

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

Asystent + zwykła aplikacja

Asystent jest aplikacją z podwyższonymi uprawnieniami, ponieważ jest fabrycznie zainstalowany i ma rolę RoleManager.ROLE_ASSISTANT. Każda inna fabrycznie zainstalowana aplikacja z tą rolą jest traktowana podobnie.

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

  • Asystent może odbierać dźwięk (niezależnie od tego, czy działa na pierwszym planie, czy w tle), chyba że inna aplikacja korzystająca ze źródła dźwięku, które wymaga ochrony prywatności, już go przechwytuje.

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

Pamiętaj, że obie aplikacje otrzymują dźwięk tylko wtedy, gdy Asystent działa w tle, a druga aplikacja nie przechwytuje dźwięku ze źródła, które może naruszać prywatność.

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

AccessibilityService wymaga ścisłej deklaracji.

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

  • Jeśli interfejs usługi jest na pierwszym planie, zarówno usługa, jak i aplikacja otrzymują dane wejściowe audio. To zachowanie umożliwia korzystanie z funkcji takich jak sterowanie połączeniem głosowym lub nagrywaniem filmu za pomocą poleceń głosowych.

  • Jeśli usługa nie jest na górze, ten przypadek jest traktowany jak zwykły przypadek z 2 aplikacjami opisany poniżej.

2 zwykłe aplikacje,

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

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

  • Jeśli żadna z aplikacji nie jest aplikacją poufną, dźwięk jest odtwarzany z aplikacji, której interfejs jest na wierzchu. Jeśli żadna z aplikacji nie ma interfejsu, dźwięk jest przekazywany do tej, która rozpoczęła przechwytywanie jako ostatnia.
  • Jeśli jedna z aplikacji jest wrażliwa na prywatność, otrzymuje dźwięk, a druga aplikacja otrzymuje ciszę, nawet jeśli ma interfejs użytkownika na górze lub rozpoczęła przechwytywanie później.
  • Jeśli obie aplikacje są wrażliwe na prywatność, aplikacja, która rozpoczęła przechwytywanie jako ostatnia, otrzymuje dźwięk, a druga – ciszę.

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 dźwięk wejściowy zgodnie z tymi regułami:

Działanie Androida 11

Android 11 (poziom API 30) stosuje opisany powyżej schemat priorytetów Androida 10. Zapewnia też nowe metody w AudioRecord, MediaRecorder i AAudioStream, które umożliwiają włączanie i wyłączanie możliwości jednoczesnego nagrywania dźwięku, niezależnie od wybranego przypadku użycia.

Nowe metody to:

Gdy setPrivacySensitive() ma wartość true, przypadek użycia przechwytywania jest prywatny i nawet uprzywilejowany Asystent nie może przechwytywać jednocześnie. To ustawienie zastępuje działanie domyślne, które zależy od źródła dźwięku. Na przykład VOICE_COMMUNICATION jest domyślnie prywatny, ale UNPROCESSED nie.

Zmiany konfiguracji

Gdy kilka aplikacji jednocześnie przechwytuje dźwięk, tylko 1 lub 2 z nich 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 dla każdej aktywnej aplikacji może się zmienić (np. z wbudowanego mikrofonu na podłączony zestaw słuchawkowy Bluetooth).
  • Wstępne przetwarzanie powiązane z aktywną aplikacją o najwyższym priorytecie jest włączone. Wszystkie pozostałe procesy wstępnego przetwarzania są ignorowane.

Aktywna aplikacja może zostać wyciszona, gdy aktywna stanie się 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:

  • Wyciszenie włączone lub wyłączone
  • Urządzenie zostało zmienione
  • Zmieniono przetwarzanie wstępne
  • Zmieniono właściwości strumienia (częstotliwość próbkowania, maska kanału, format próbki)

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

Metoda onRecordingConfigChanged() zwraca obiekt AudioRecordingConfiguration zawierający bieżący stan przechwytywania dźwięku. Aby dowiedzieć się więcej o tej zmianie, skorzystaj z tych metod:

isClientSilenced()
Zwraca wartość „true”, jeśli dźwięk zwracany do klienta jest obecnie wyciszony ze względu na zasady przechwytywania.
getAudioDevice()
Zwraca aktywne urządzenie audio.
getEffects()
Zwraca aktywny efekt przetwarzania wstępnego. Pamiętaj, że aktywny efekt może nie być taki sam jak efekty zwracane 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 otrzymane przez klienta zawsze są zgodne z wymaganym formatem zwracanym przez getClientFormat(). Platforma automatycznie wykonuje niezbędne ponowne próbkowanie, 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.

Możesz uzyskać ogólny widok wszystkich aktywnych nagrań na urządzeniu, wywołując funkcję AudioManager.getActiveRecordingConfigurations().