Microphone Permission е системно разрешение, необходимо на приложението за достъп до микрофона на устройството. То е нужно за запис на аудио, гласови съобщения, видеоповиквания и разпознаване на реч. Според Apple Developer Documentation, 2024, всички приложения, които използват заснемане на аудио, са задължени да изискват изричното съгласие на потребителя чрез системен диалог.
Основни неща
Microphone Permission е механизъм за защита на поверителността, който предотвратява неразрешен запис на аудио от микрофона на устройството. Мобилните платформи класират микрофона сред най-чувствителните ресурси, тъй като записът на звук може да улавя лични разговори, заобикалящата среда и поверителна информация.
Android класифицира RECORD_AUDIO като опасно разрешение, а iOS изисква задължително добавяне на ключа NSMicrophoneUsageDescription в Info.plist. И на двете платформи заявката се изпълнява по време на изпълнение, а потребителят може по всяко време да оттегли разрешението чрез системните настройки. Системният индикатор за запис (оранжева точка на iOS, зелен индикатор на Android 12+) сигнализира на потребителя, че приложението използва микрофона в момента.
Според проучване на Pew Research Center (2024), 54% от потребителите на мобилни устройства поне веднъж са отказали на приложение достъп до микрофона. Основната причина е неразбирането защо на приложението му е нужен запис на аудио. Затова разработчикът трябва възможно най-прозрачно да обяснява целта на използване на микрофона.
Разрешението за микрофон на Android се изисква чрез деклариране на RECORD_AUDIO в манифеста и заявка по време на изпълнение в кода на приложението. Започвайки от Android 10, достъпът до микрофона допълнително се регулира от ограничения за фоново работещи приложения.
Първата стъпка е да се декларира разрешението RECORD_AUDIO във файла на манифеста. Без това деклариране заявката по време на изпълнение няма да има ефект и приложението няма да може да получи достъп до микрофона.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
CAPTURE_AUDIO_OUTPUT е системно разрешение, недостъпно за приложения на трети страни. То се използва само от системни приложения за заснемане на аудио изхода. За обикновените приложения е достатъчно RECORD_AUDIO за запис от микрофона.
След декларирането в манифеста трябва да се изпълни заявката по време на изпълнение. Нека разгледаме пример с използване на AudioRecord за запис на аудио от микрофона.
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()
// Запис на аудио данни в буфера
}
Важно е да се обработва правилно жизненият цикъл на аудио записа. При преминаване на приложението във фонов режим на Android 9 и по-нова версия, записът от микрофона може да бъде спрян от системата. Започвайки от Android 10, фонов достъп до микрофона е допълнително ограничен: приложението във фонов режим не може да започне запис, а активният запис се прекъсва. За фонов запис се изисква MediaProjection или Service с известие.
Разрешението за микрофон на iOS се настройва чрез ключа NSMicrophoneUsageDescription в Info.plist и извикването на метода AVAudioSession.requestRecordPermission. Apple изисква задължително посочване на причината за използване на микрофона в диалога за заявка.
Ключът NSMicrophoneUsageDescription е задължителен за всяко приложение, което иска достъп до микрофона. Без него приложението ще бъде прекратено неочаквано при опит за запис на аудио.
<key>NSMicrophoneUsageDescription</key>
<string>Приложението има нужда от достъп до микрофона, за да записва гласови бележки и да изпраща аудио съобщения.</string>
Заявката за достъп до микрофона на iOS се изпълнява чрез AVAudioSession. След получаване на отговора приложението настройва аудио сесията и започва записа.
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)")
}
}
На iOS 14 и по-нова версия приложението, което използва микрофона, показва оранжев индикатор в лентата на състоянието. Потребителят вижда кое приложение в момента записва аудио. Ако приложението използва микрофона във фонов режим без сериозна причина, Apple може да отхвърли актуализацията. AVAudioSession позволява да се настрои категорията и режима на аудио сесията, определяйки поведението на приложението при преминаване във фонов режим.
Сценариите за използване на микрофона в мобилните приложения са разнообразни: от обикновен запис на глас до сложна обработка на аудио потока в реално време.
Месинджърите и приложенията за бележки използват микрофона за запис на гласови съобщения. В този случай Microphone Permission се изисква при натискане на бутона за запис. След приключване на записа е важно да се спре аудио сесията, за да могат други приложения да използват микрофона. AVAudioSession на iOS и AudioManager на Android управляват аудио фокуса.
Приложенията с гласово въвеждане (търсене, диктовка, гласови асистенти) използват микрофона в комбинация с API за разпознаване на реч. На Android това е SpeechRecognizer от android.speech, а на iOS — SFSpeechRecognizer от Speech framework. За разпознаване на реч може да е необходимо допълнително разрешение за достъп до услугите за разпознаване (SPEECH на Android, SFSpeechRecognizer.requestAuthorization на iOS).
Приложенията за видеоповиквания (WebRTC, Zoom, Telegram) искат Microphone Permission едновременно с Camera Permission. В този контекст е важно и двете разрешения да се искат последователно, а не едновременно, за да не бъде потребителят затрупан с диалози. WebRTC използва getUserMedia за заснемане на аудио и видео, но на мобилните платформи предварително се изискват системни разрешения.
За качествен запис е необходимо правилно да се настроят параметрите на аудио сесията. На iOS категорията .playAndRecord позволява едновременно възпроизвеждане и запис на звук. На Android изборът AudioSource.MIC осигурява заснемане от основния микрофон, а AudioSource.VOICE_COMMUNICATION оптимизира записа за гласова връзка. Допълнително може да се настрои честота на дискретизация 44100 Hz и формат PCM 16 бита за постигане на стандартно CD качество.
При запис на аудио могат да възникнат системни прекъсвания: входящо обаждане, задействане на аларма, известие от друго приложение. На iOS AVAudioSessionDelegate обработва beginInterruption и endInterruption. На Android AudioManager.OnAudioFocusChangeListener уведомява приложението за загуба или връщане на аудио фокуса. Коректната обработка на прекъсванията позволява да се запази записът при неочаквани събития и да се избегне загуба на данни. Препоръчително е записът да се поставя на пауза при загуба на фокус и да се възобновява след връщането му, с уведомяване на потребителя.
Оптимизацията на заснемането на аудио включва настройка на честотата на дискретизация, размера на буфера и формата на кодиране. За гласови съобщения е достатъчна честота 44100 Hz и моно канал. За разпознаване на реч може да е необходима честота 16000 Hz.
На iOS използвайте AVAudioSession.setPreferredIOBufferDuration за настройка на закъснението на записа. По-малкият буфер намалява закъснението, но увеличава натоварването на процесора. На Android AudioRecord.getMinBufferSize връща минималния размер на буфера за зададените параметри. Препоръчително е да се използва буфер не по-малък от този минимум, за да се предотврати загуба на данни при запис в условия на високо натоварване на системата.
Най-добрите практики за работа с Microphone Permission са насочени към повишаване на доверието на потребителя и съответствие с изискванията на платформите.
Преди заявката за Microphone Permission покажете екран, на който обяснявате защо на приложението му е нужен микрофон и как ще се използва записът. Посочете дали аудиото се предава на сървъра или се обработва локално. Потребителите значително по-често се съгласяват на достъп, ако разбират, че записът не напуска устройството. Локалната обработка (on-device ASR) е силен аргумент в полза на доверието.
Ако приложението не изисква фонов запис на аудио, непременно спирайте микрофона при преминаване във фонов режим. Това не само пести батерия, но и предотвратява негативната реакция на потребителя, видял индикатора за запис. На iOS използвайте методите на UIApplicationDelegate, като applicationDidEnterBackground, за поставяне на записа на пауза. На Android обработвайте onPause и onStop в Activity или Service.
Показвайте собствен индикатор за запис (анимирана иконка на микрофон или вълна) по време на заснемането на аудио. Това информира потребителя, че микрофонът е активен, и намалява риска от негативна реакция. Apple и Google препоръчват системният индикатор да се дублира със собствен UI елемент за максимална прозрачност.
Често задавани въпроси
Не, разрешение за микрофон се изисква само за заснемане на аудио от микрофона. Възпроизвеждането на звук през високоговорител или слушалки не изисква Microphone Permission. За възпроизвеждането е достатъчно да се настрои аудио сесията на iOS или AudioTrack на Android.
Използвайте ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO). Методът връща PackageManager.PERMISSION_GRANTED или PERMISSION_DENIED. Допълнително проверете дали микрофонът е наличен на устройството чрез PackageManager.hasSystemFeature.
Предложете алтернативен сценарий: текстово въвеждане вместо гласово, изпращане на съобщение без аудио, гледане на видео без звук. Ако функцията за гласово въвеждане е критична, покажете екран с инструкции за включване на разрешението в системните настройки и бутон за преминаване.
Започвайки от Android 12, приложението във фонов режим не може да получи достъп до микрофона. Активният запис се прекъсва при преминаване във фонов режим. Освен това се появи индикаторът Privacy Chip — зелена иконка в лентата на състоянието, показваща, че приложението използва микрофона.
Най-честите причини са: липса на ключа NSMicrophoneUsageDescription, неконкретно описание на причината („за подобряване на услугата“ вместо „за запис на гласови съобщения“), искане на разрешение без изрично действие на потребителя или използване на микрофона във фонов режим без обоснована функционалност.
Изводи
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също