Udostępnianie wejścia audio

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

Czasami dwie lub więcej aplikacji może chcieć „rejestrować” to samo wejście audio. Mogą wykonywać inne zadania. Na przykład niektóre aplikacje odbierające dźwięk mogą „nagrywać” (takie jak prosty dyktafon), a inne – „nasłuchują” (np. Asystent Google lub usługa ułatwień dostępu, które reagują na polecenia głosowe).

W obu przypadkach aplikacje te będą otrzymywać dane wejściowe audio. Na tej stronie używamy terminu „przechwytywanie” 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 dostarczeniem sygnału audio z tego samego źródła do wszystkich. Na tej stronie opisujemy, jak system Android udostępnia dane audio różnym aplikacjom, które przechwytują dźwięk.

Działanie w wersji sprzed Androida 10

Przed Androidem 10 wejściowy strumień audio mógł być rejestrowany w danym momencie tylko przez jedną aplikację. Jeśli jakaś aplikacja już nagrywała lub nasłuchiwała dźwięku, mogła utworzyć obiekt AudioRecord, ale wywołanie funkcji AudioRecord.startRecording() powoduje wyświetlenie błędu i nagrywanie się nie rozpoczęło.

Wyjątkiem od tej reguły było sytuacja, w której aplikacja z podwyższonymi 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 audio typu HOTWORD. W takim przypadku inna aplikacja może rozpocząć nagrywanie. Wtedy aplikacja z podwyższonymi uprawnieniami została zamknięta, a nowa aplikacja przechwytuje dane wejściowe.

W Androidzie 9 wprowadziliśmy jeszcze jedną zmianę: dane wejściowe audio mogą rejestrować tylko aplikacje działające na pierwszym planie (lub w usłudze na pierwszym planie). Gdy rozpoczęła się przechwytywanie aplikacji bez usługi i komponentu interfejsu na pierwszym planie, nadal działała, ale była cicha, nawet jeśli była jedyną aplikacją, która przechwytywała dźwięk.

Działanie Androida 10

W wersjach wcześniejszych niż 10 działa zasada „kto pierwszy, ten lepszy”. Gdy aplikacja zacznie rejestrować dźwięk, żadne inne aplikacje nie będą miały do niego dostępu, dopóki aplikacja nie zatrzyma nagrywania.

Android 10 wprowadza schemat priorytetu, który umożliwia przełączanie wejściowego strumienia audio między aplikacjami podczas ich działania. W większości przypadków, jeśli nowa aplikacja pobierze dane wejściowe audio, aplikacja, która wcześniej przechwytuje dane, będzie nadal działać, ale będzie w ciszy. W niektórych przypadkach system może nadal przesyłać dźwięk do obu aplikacji. Poniżej opisujemy różne scenariusze udostępniania.

Schemat ten jest podobny do sposobu, w jaki sterowanie dźwiękiem obsługuje wiele aplikacji rywalizujących o użycie wyjścia audio. Funkcja ta jest jednak zarządzana za pomocą automatycznych żądań wzmocnienia i zwolnienia nacisku, natomiast opisany tutaj schemat przełączania danych wejściowych opiera się na zasadzie priorytetów, która jest stosowana automatycznie za każdym razem, gdy nowa aplikacja rozpoczyna nagrywanie dźwięku.

W celu rejestrowania dźwięku na Androidzie są rozróżniane 2 rodzaje aplikacji:

  • Zwykłe aplikacje są instalowane przez użytkownika.
  • Aplikacje z podwyższonymi uprawnieniami są fabrycznie zainstalowane na urządzeniu. Obejmują one 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 zapewniającego ochronę prywatności: CAMCORDER lub VOICE_COMMUNICATION.

Oto reguły ustalania priorytetów związane z używaniem i udostępnianiem wejścia audio:

  • Aplikacje z podwyższonymi uprawnieniami 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 zapewniającego ochronę prywatności, mają wyższy priorytet niż aplikacje, które nim nie są.
  • Dwie zwykłe aplikacje nie mogą nagrywać dźwięku jednocześnie.
  • W niektórych przypadkach aplikacja z podwyższonymi uprawnieniami może udostępniać dane wejściowe audio innej aplikacji.
  • Jeśli 2 aplikacje działające w tle o tym samym priorytecie rejestrują dźwięk, ta ostatnia uruchomiona ma wyższy priorytet.

Scenariusze udostępniania

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

Istnieją 4 główne scenariusze:

  • Asystent + zwykła aplikacja
  • Usługa ułatwień dostępu + zwykła aplikacja
  • Dwie zwykłe aplikacje
  • Rozmowa głosowa + zwykła aplikacja

Asystent + zwykła aplikacja

Asystent jest aplikacją uprzywilejowaną, ponieważ jest wstępnie zainstalowana i ma przypisaną rolę RoleManager.ROLE_ASSISTANT. Każda inna wstępnie zainstalowana aplikacja z tą rolą jest traktowana w podobny sposób.

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 jest na pierwszym planie, czy w tle), chyba że inna aplikacja korzystająca ze źródła dźwięku chroniącego prywatność nagrywa już dźwięk.

  • Aplikacja odbiera dźwięk, chyba że na górze ekranu widać widoczny komponent interfejsu Asystenta.

Pamiętaj, że obie aplikacje odbierają dźwięk tylko wtedy, gdy Asystent działa w tle, a druga nie przechwytuje dźwięku ze źródła zapewniającego ochronę 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 otrzymują dane wejściowe audio. Ta funkcja umożliwia np. sterowanie połączeniem głosowym lub nagrywaniem wideo za pomocą poleceń głosowych.

  • Jeśli usługa nie jest obsługiwana, ten przypadek jest traktowany jak normalny przypadek z 2 aplikacjami.

Dwie zwykłe aplikacje

Gdy 2 aplikacje nagrywają jednocześnie, tylko jedna odbiera 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 dba o prywatność, aplikacja z interfejsem u góry odbiera dźwięk. Jeśli żadna z aplikacji nie ma interfejsu, dźwięk otrzymuje dźwięk w tym, który jako ostatni rozpoczął przechwytywanie.
  • Jeśli któraś z aplikacji dba o prywatność, odbiera dźwięk, a druga jest wyciszona, nawet jeśli ma interfejs użytkownika lub zaczęła nagrywać niedawno.
  • Jeśli obie aplikacje dbają o prywatność, ta, która ostatnio zaczęła nagrywać dźwięk, odbiera dźwięk, a druga jest wyciszona.

Rozmowa głosowa + zwykła aplikacja

Rozmowa głosowa jest aktywna, jeśli tryb „Tylko dźwięk” zwrócony przez użytkownika AudioManager.getMode() to MODE_IN_CALL lub MODE_IN_COMMUNICATION.

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

Działanie Androida 11

Android 11 (poziom interfejsu API 30) korzysta ze schematu priorytetu Androida 10 opisanego powyżej. W AudioRecord, MediaRecorder i AAudioStream dostępne są też nowe metody, które włączają i wyłączają możliwość 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 Asystent z podwyższonymi uprawnieniami nie może robić zdjęć jednocześnie. 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 prywatny, ale UNPROCESSED już nie.

Zmiany konfiguracji

Jeśli kilka aplikacji jednocześnie rejestruje dźwięk, tylko jedna lub dwie z nich są „aktywne” (odbiera dźwięk), a pozostałe są wyciszone (odbierają dźwięk). Gdy zmienią się aktywne aplikacje, platforma audio może zmienić konfigurację ścieżek audio zgodnie z tymi regułami:

  • Wejście 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. Wszystkie inne wstępne procesy przetwarzania są ignorowane.

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

  • Nagrywaj wyciszone lub niewyciszone
  • Urządzenie zostało zmienione
  • Zmieniono wstępne przetwarzanie
  • zmiany właściwości strumienia (częstotliwość próbkowania, maska kanału, format przykładowy);

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

Metoda onRecordingConfigChanged() zwraca wartość AudioRecordingConfiguration zawierającą bieżący stan przechwytywania dźwięku. Aby uzyskać informacje o zmianie, użyj tych metod:

isClientSilenced()
Zwraca wartość „true” (prawda), jeśli dźwięk zwracany klientowi jest obecnie wyciszony z powodu zasady przechwytywania.
getAudioDevice()
Zwraca aktywne urządzenie audio.
getEffects()
Zwraca aktywny efekt wstępnego przetwarzania. Pamiętaj, że aktywny efekt może się różnić od efektu zwracanego przez metodę 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 otrzymywane przez klienta zawsze uwzględniają wymagany format zwracany przez getClientFormat(). Platforma automatycznie przeprowadza odpowiednie ponowne próbkowanie oraz konwersję kanału i formatu z formatu używanego na interfejsie sprzętowym do formatu określonego przez klienta.
AudioRecord.getActiveRecordingConfiguration().
Zwraca aktywną konfigurację nagrywania.

Możesz uzyskać ogólny widok wszystkich aktywnych nagrań na urządzeniu, dzwoniąc pod numer AudioManager.getActiveRecordingConfigurations().