Microphone Permission je системска дозвола неопходна апликацији за приступ микрофону уређаја. Потребна је за снимање аудија, гласовних порука, видео позива и препознавање говора. Према 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође