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:
- W trakcie rozmowy zawsze jest odtwarzany dźwięk.
- Aplikacja może rejestrować dźwięk, jeśli usługę ułatwień dostępu.
Aplikacja może przechwytywać połączenia głosowe, jeśli są one zastrzeżone (wstępnie zainstalowana) aplikacja z uprawnieniami
CAPTURE_AUDIO_OUTPUT
Aby zarejestrować połączenie przychodzące (TX), link pobierania (RX) lub obie te wartości połączenia głosowego, aplikacja musi określ źródła dźwięku
MediaRecorder.AudioSource.VOICE_UPLINK
lubMediaRecorder.AudioSource.VOICE_DOWNLINK
, i/lub urządzenieAudioDeviceInfo.TYPE_TELEPHONY
.
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:
AudioRecord.Builder.setPrivacySensitive()
AudioRecord.isPrivacySensitive()
MediaRecorder.setPrivacySensitive()
MediaRecorder.isPrivacySensitive()
AAudioStreamBuilder_setPrivacySensitive()
AAudioStream_isPrivacySensitive()
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()