Udostępnianie wejścia audio

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

Czasami dwie lub więcej aplikacji może chcieć „przechwytywać” z tego samego wejścia audio. Mogą wykonywać inne zadania. Na przykład niektóre aplikacje, które odbierają dźwięk, mogą być „nagrywaniem”, takich jak zwykły dyktafon, a inne aplikacje mogą nasłuchiwać, takich jak Asystent Google lub usługa ułatwień dostępu, reagować na polecenia głosowe;

W obu przypadkach aplikacje te będą otrzymywać dane wejściowe audio. Na tej stronie używamy terminu „przechwyć” niezależnie od tego, czy aplikacja nagrywa lub tylko słucha.

Jeśli co najmniej 2 aplikacje chcą rejestrować dźwięk jednocześnie, może to oznaczać, że wystąpił problem. dostarczania sygnału audio z tego samego źródła do wszystkich urządzeń. Na tej stronie opisujemy sposób, w jaki system Android udostępnia wejście audio różnym aplikacjom, które zapisują dźwięk.

Działanie w wersji sprzed Androida 10

Przed Androidem 10 wejściowy strumień audio mógł być przechwytywany tylko przez jedną aplikację obecnie się znajdujesz. Jeśli jakaś aplikacja już nagrywała lub słuchała dźwięku, aplikacja może zostanie utworzony obiekt AudioRecord, ale wywołanie zwróci błąd AudioRecord.startRecording(). i nagrywanie się nie rozpoczęło.

Wyjątkiem od tej reguły były aplikacje z podwyższonymi uprawnieniami (np. Asystent Google lub usługa ułatwień dostępu) miała odpowiednie uprawnienia android.permission.CAPTURE_AUDIO_HOTWORD i użyli źródła audio typu HOTWORD W takim przypadku inna aplikacja może rozpocząć nagrywanie. W takim przypadku została zamknięta i nowa aplikacja przechwytuje dane wejściowe.

W Androidzie 9 wprowadziliśmy jeszcze jedną zmianę: tylko aplikacje działające na pierwszym planie (lub usługa działająca na pierwszym planie) może przechwytywać dane wejściowe audio. Gdy aplikacja bez usługa na pierwszym planie lub komponent interfejsu na pierwszym planie, aplikacja na pierwszym planie, kontynuował pracę, ale bez dźwięku, nawet jeśli była jedyną aplikacją przechwytującą dźwięku w danej chwili.

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 dostępu do wejścia audio, aż aplikacja, która przechwytuje dźwięk, nie zatrzyma się.

Android 10 narzuca 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 wejściowe audio, aplikacja nagrywająca wcześniej działa nadal, ale jest wyciszona. W niektórych system może nadal przesyłać dźwięk do obu aplikacji. Różne scenariuszy udostępniania opisaliśmy poniżej.

Schemat ten jest podobny do tego, jak sterowanie dźwiękiem obsługuje wiele aplikacji rywalizujących o użycie wyjścia audio. Trybem aktywności audio zarządza jednak żądań automatycznych, aby uzyskać i uwolnić fokus, podczas gdy przełączanie danych wejściowych opisany tutaj schemat opiera się na stosowanej przez nas zasadzie priorytetów automatycznie za każdym razem, gdy nowa aplikacja zacznie rejestrować dźwięk.

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

  • „Zwykłe” które są instalowane przez użytkownika.
  • „Z podwyższonymi uprawnieniami” aplikacje 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żywasz w nim wartości „z uwzględnieniem prywatności”, źródło dźwięku: 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ą zarejestrować dźwięk, oba te urządzenia mogą odbierać sygnał wejściowy, a jeden z nich może cisza.

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ą dla zaawansowanych, bo jest wstępnie zainstalowana i zawiera 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 (bez względu na to, czy jest na pierwszym planie czy w tle) chyba że inna aplikacja korzystająca ze źródła dźwięku zapewniającego ochronę prywatności już nagrywa.

  • Aplikacja odbiera dźwięk, chyba że Asystent ma widoczny interfejs użytkownika w górnej części ekranu.

Pamiętaj, że obie aplikacje odbierają dźwięk tylko wtedy, gdy Asystent działa w tle. a druga aplikacja 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 dokładnej 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ą wejście audio. Ta opcja umożliwia m.in. sterowanie połączeniem głosowym lub obrazem. nagrywania 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 narusza prywatności, aplikacja z interfejsem na górze 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 narusza prywatność, odbiera dźwięk, a następnie inna aplikacja jest wyciszona, nawet jeśli ma interfejs użytkownika lub rozpoczęła przechwytywanie niedawno.
  • Jeśli obie aplikacje dbają o prywatność, aplikacja, która zaczęła przechwytywać Ostatnio odbiera dźwięk, a drugi jest wyciszony.

Rozmowa głosowa + zwykła aplikacja

Rozmowa głosowa jest aktywna, jeśli tryb „Tylko dźwięk” powrócił 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) zachowuje zgodność ze schematem priorytetów Androida 10. opisane powyżej. Udostępnia też nowe metody w AudioRecord, MediaRecorder oraz AAudioStream, 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, a nawet Asystent z podwyższonymi uprawnieniami nie może jednocześnie nagrywać. To ustawienie zastępuje działanie domyślne, zależne od źródła dźwięku. Przykład: Domena VOICE_COMMUNICATION jest domyślnie prywatna, ale UNPROCESSED nie jest.

Zmiany konfiguracji

Jeśli kilka aplikacji jednocześnie przechwytuje dźwięk, tylko jedna lub dwie „aktywne” (odbieranie dźwięku); a pozostałe są wyciszone (otrzymuje ciszę). Gdy aktywnych aplikacji, platforma audio może zmienić konfigurację ścieżek audio zgodnie z tymi zasadami:

  • Wejściowe urządzenie audio każdej aktywnej aplikacji może się zmienić (na przykład z wbudowanego mikrofonu do podłączonego zestawu słuchawkowego Bluetooth).
  • Włączone jest wstępne przetwarzanie powiązane z aktywną aplikacją o najwyższym priorytecie. Wszystkie jest ignorowany.

Aktywna aplikacja może być wyciszona, gdy aplikacja o wyższym priorytecie staje się aktywna, możesz zarejestrować AudioManager.AudioRecordingCallback w AudioRecord lub MediaRecorder powiadamiany 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);

Musisz zadzwonić AudioRecord.registerAudioRecordingCallback() przed rozpoczęciem nagrywania. 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. Użyj następujących metod, aby dowiedzieć się o zmianie:

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()