Microphone Permission to systemowe uprawnienie niezbędne aplikacji do uzyskania dostępu do mikrofonu urządzenia. Jest wymagane do nagrywania dźwięku, wiadomości głosowych, połączeń wideo i rozpoznawania mowy. Według Apple Developer Documentation, 2024, wszystkie aplikacje korzystające z przechwytywania dźwięku są zobowiązane do żądania wyraźnej zgody użytkownika za pomocą systemowego okna dialogowego.
Najważniejsze
Microphone Permission to mechanizm ochrony prywatności, który zapobiega nieautoryzowanemu nagrywaniu dźwięku z mikrofonu urządzenia. Platformy mobilne klasyfikują mikrofon jako jeden z najbardziej wrażliwych zasobów, ponieważ nagrywanie dźwięku może przechwytywać prywatne rozmowy, otoczenie i poufne informacje.
Android klasyfikuje RECORD_AUDIO jako niebezpieczne uprawnienie, a iOS wymaga obowiązkowego dodania klucza NSMicrophoneUsageDescription w Info.plist. Na obu platformach żądanie jest wykonywane w czasie wykonania, a użytkownik może w każdej chwili cofnąć uprawnienie przez ustawienia systemowe. Systemowy wskaźnik nagrywania (pomarańczowa kropka na iOS, zielony wskaźnik na Android 12+) sygnalizuje użytkownikowi, że aplikacja aktualnie używa mikrofonu.
Według badania Pew Research Center (2024), 54% użytkowników urządzeń mobilnych przynajmniej raz odmówiło aplikacji dostępu do mikrofonu. Głównym powodem jest brak zrozumienia, po co aplikacji nagrywanie dźwięku. Dlatego programista musi jak najbardziej przejrzyście wyjaśniać cel używania mikrofonu.
Uprawnienie do mikrofonu na Android jest żądane poprzez zadeklarowanie RECORD_AUDIO w manifeście i żądanie w czasie wykonania w kodzie aplikacji. Od Androida 10 dostęp do mikrofonu jest dodatkowo regulowany ograniczeniami dla aplikacji działających w tle.
Pierwszym krokiem jest zadeklarowanie uprawnienia RECORD_AUDIO w pliku manifestu. Bez tej deklaracji żądanie w czasie wykonania nie będzie skuteczne, a aplikacja nie uzyska dostępu do mikrofonu.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
CAPTURE_AUDIO_OUTPUT to uprawnienie systemowe niedostępne dla aplikacji firm trzecich. Jest używane tylko przez aplikacje systemowe do przechwytywania wyjścia audio. Zwykłe aplikacje potrzebują jedynie RECORD_AUDIO do nagrywania z mikrofonu.
Po deklaracji w manifeście należy wykonać żądanie w czasie wykonania. Rozważmy przykład użycia AudioRecord do nagrywania dźwięku z mikrofonu.
private val recordAudioPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
startRecording()
} else {
showMicrophoneExplanation()
}
}
fun startRecording() {
val sampleRate = 44100
val bufferSize = AudioRecord.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT)
val recorder = AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize)
recorder.startRecording()
// Nagrywanie danych audio do bufora
}
Ważne jest prawidłowe obsługiwanie cyklu życia nagrywania dźwięku. Gdy aplikacja przechodzi do trybu tła na Android 9 i nowszych, nagrywanie z mikrofonu może zostać wstrzymane przez system. Od Androida 10 dostęp do mikrofonu w tle jest dodatkowo ograniczony: aplikacja w tle nie może rozpocząć nagrywania, a aktywne nagrywanie jest wstrzymywane. Do nagrywania w tle wymagany jest MediaProjection lub Service z powiadomieniem.
Uprawnienie do mikrofonu na iOS jest konfigurowane poprzez klucz NSMicrophoneUsageDescription w Info.plist i wywołanie metody AVAudioSession.requestRecordPermission. Apple wymaga obowiązkowego wskazania przyczyny używania mikrofonu w oknie dialogowym żądania.
Klucz NSMicrophoneUsageDescription jest obowiązkowy dla każdej aplikacji, która żąda dostępu do mikrofonu. Bez niego aplikacja ulegnie awarii przy próbie nagrywania dźwięku.
<key>NSMicrophoneUsageDescription</key>
<string>Aplikacja potrzebuje dostępu do mikrofonu do nagrywania notatek głosowych i wysyłania wiadomości audio.</string>
Żądanie dostępu do mikrofonu na iOS jest wykonywane przez AVAudioSession. Po otrzymaniu odpowiedzi aplikacja konfiguruje sesję audio i rozpoczyna nagrywanie.
import AVFAudio
func requestMicrophoneAccess() {
AVAudioSession.sharedInstance().requestRecordPermission { granted in
DispatchQueue.main.async {
if granted {
self.configureAudioSession()
self.startAudioRecording()
} else {
self.redirectToSettings()
}
}
}
}
private func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playAndRecord, mode: .default)
try session.setActive(true)
} catch {
print("Audio session error: \(error)")
}
}
Na iOS 14 i nowszych aplikacja używająca mikrofonu wyświetla pomarańczowy wskaźnik na pasku stanu. Użytkownik widzi, która aplikacja aktualnie nagrywa dźwięk. Jeśli aplikacja używa mikrofonu w tle bez ważnego powodu, Apple może odrzucić aktualizację. AVAudioSession umożliwia skonfigurowanie kategorii i trybu sesji audio, określając zachowanie aplikacji przy przejściu do trybu tła.
Scenariusze użycia mikrofonu w aplikacjach mobilnych są różnorodne: od prostego nagrywania głosu po złożone przetwarzanie strumienia audio w czasie rzeczywistym.
Komunikatory i aplikacje do notatek używają mikrofonu do nagrywania wiadomości głosowych. W tym przypadku Microphone Permission jest żądane po naciśnięciu przycisku nagrywania. Po zakończeniu nagrywania ważne jest zatrzymanie sesji audio, aby inne aplikacje mogły korzystać z mikrofonu. AVAudioSession na iOS i AudioManager na Android zarządzają fokusem audio.
Aplikacje z wprowadzaniem głosowym (wyszukiwanie, dyktowanie, asystenci głosowi) używają mikrofonu w połączeniu z API rozpoznawania mowy. Na Android jest to SpeechRecognizer z android.speech, na iOS — SFSpeechRecognizer z Speech framework. Do rozpoznawania mowy może być wymagane dodatkowe uprawnienie dostępu do usług rozpoznawania (SPEECH na Android, SFSpeechRecognizer.requestAuthorization na iOS).
Aplikacje do połączeń wideo (WebRTC, Zoom, Telegram) żądają Microphone Permission jednocześnie z Camera Permission. W tym kontekście ważne jest żądanie obu uprawnień sekwencyjnie, a nie jednocześnie, aby nie przeciążać użytkownika oknami dialogowymi. WebRTC używa getUserMedia do przechwytywania dźwięku i wideo, ale na platformach mobilnych wymagane są wcześniej uprawnienia systemowe.
Do wysokiej jakości nagrywania wymagane jest prawidłowe skonfigurowanie parametrów sesji audio. Na iOS kategoria .playAndRecord umożliwia jednoczesne odtwarzanie i nagrywanie dźwięku. Na Android wybór AudioSource.MIC zapewnia przechwytywanie z głównego mikrofonu, a AudioSource.VOICE_COMMUNICATION optymalizuje nagrywanie do komunikacji głosowej. Dodatkowo można skonfigurować częstotliwość próbkowania 44100 Hz i format PCM 16 bitów, aby osiągnąć standardową jakość CD.
Podczas nagrywania dźwięku mogą wystąpić przerwania systemowe: połączenie przychodzące, alarm, powiadomienie z innej aplikacji. Na iOS AVAudioSessionDelegate obsługuje beginInterruption i endInterruption. Na Android AudioManager.OnAudioFocusChangeListener powiadamia aplikację o utracie lub odzyskaniu fokusu audio. Prawidłowa obsługa przerwań pozwala zachować nagranie przy nieoczekiwanych zdarzeniach i uniknąć utraty danych. Zaleca się wstrzymywanie nagrywania przy utracie fokusu i wznawianie po jego odzyskaniu z powiadomieniem użytkownika.
Optymalizacja przechwytywania dźwięku obejmuje konfigurację częstotliwości próbkowania, rozmiaru bufora i formatu kodowania. Do wiadomości głosowych wystarcza częstotliwość 44100 Hz i kanał mono. Do rozpoznawania mowy może być wymagana częstotliwość 16000 Hz.
Na iOS użyj AVAudioSession.setPreferredIOBufferDuration do konfiguracji opóźnienia nagrywania. Mniejszy bufor zmniejsza opóźnienie, ale zwiększa obciążenie procesora. Na Android AudioRecord.getMinBufferSize zwraca minimalny rozmiar bufora dla zadanych parametrów. Zaleca się używanie bufora nie mniejszego niż to minimum, aby zapobiec utracie danych podczas nagrywania w warunkach wysokiego obciążenia systemu.
Najlepsze praktyki pracy z Microphone Permission mają na celu zwiększenie zaufania użytkownika i spełnienie wymagań platform.
Przed żądaniem Microphone Permission pokaż ekran, na którym wyjaśnisz, po co aplikacji mikrofon i jak będzie używane nagrywanie. Wskaż, czy dźwięk jest przesyłany na serwer, czy przetwarzany lokalnie. Użytkownicy znacznie częściej wyrażają zgodę na dostęp, jeśli rozumieją, że nagranie nie opuszcza urządzenia. Przetwarzanie lokalne (on-device ASR) to silny argument na rzecz zaufania.
Jeśli aplikacja nie wymaga nagrywania w tle, koniecznie zatrzymuj mikrofon przy przejściu do trybu tła. To nie tylko oszczędza baterię, ale także zapobiega negatywnej reakcji użytkownika, który widzi wskaźnik nagrywania. Na iOS używaj metod UIApplicationDelegate applicationDidEnterBackground do wstrzymania nagrywania. Na Android obsługuj onPause i onStop w Activity lub Service.
Pokazuj własny wskaźnik nagrywania (animowaną ikonę mikrofonu lub falę) podczas przechwytywania dźwięku. To informuje użytkownika, że mikrofon jest aktywny i zmniejsza ryzyko negatywnej reakcji. Apple i Google zalecają dublowanie systemowego wskaźnika własnym elementem UI dla maksymalnej przejrzystości.
Często zadawane pytania
Nie, uprawnienie do mikrofonu jest wymagane tylko do przechwytywania dźwięku z mikrofonu. Odtwarzanie dźwięku przez głośnik lub słuchawki nie wymaga Microphone Permission. Do odtwarzania wystarczy skonfigurowanie sesji audio na iOS lub AudioTrack na Android.
Użyj ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO). Metoda zwraca PackageManager.PERMISSION_GRANTED lub PERMISSION_DENIED. Dodatkowo sprawdź, czy mikrofon jest dostępny na urządzeniu przez PackageManager.hasSystemFeature.
Zaproponuj alternatywny scenariusz: wprowadzanie tekstowe zamiast głosowego, wysłanie wiadomości bez dźwięku, oglądanie wideo bez dźwięku. Jeśli funkcja głosowa jest krytyczna, pokaż ekran z instrukcją włączenia uprawnienia w ustawieniach systemowych i przyciskiem przejścia.
Od Androida 12 aplikacja w tle nie może uzyskać dostępu do mikrofonu. Aktywne nagrywanie jest wstrzymywane przy przejściu do trybu tła. Ponadto pojawił się wskaźnik Privacy Chip — zielona ikona na pasku stanu, pokazująca, że aplikacja używa mikrofonu.
Najczęstsze przyczyny: brak klucza NSMicrophoneUsageDescription, niekonkretny opis przyczyny („w celu ulepszenia usługi“ zamiast „do nagrywania wiadomości głosowych“), żądanie uprawnienia bez wyraźnego działania użytkownika lub używanie mikrofonu w tle bez uzasadnionej funkcjonalności.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również