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 به بعد، دسترسی به میکروفون additionally با محدودیتهایی برای برنامههای پسزمینه تنظیم میشود.
اولین مرحله — اعلام مجوز 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 درخواست میکنند. در این زمینه مهم است که هر دو مجوز را به صورت متوالی درخواست کنید، نه همزمان، تا کاربر با دیالوگها overload نشود. WebRTC از getUserMedia برای ضبط صدا و تصویر استفاده میکند، اما در پلتفرمهای موبایل ابتدا به مجوزهای سیستمی نیاز دارد.
برای ضبط با کیفیت بالا، پیکربندی صحیح پارامترهای جلسه صوتی مورد نیاز است. در iOS دسته .playAndRecord امکان پخش و ضبط همزمان صدا را فراهم میکند. در Android انتخاب AudioSource.MIC ضبط از میکروفون اصلی را تضمین میکند و AudioSource.VOICE_COMMUNICATION ضبط را برای ارتباط صوتی بهینه میکند. علاوه بر این، میتوان فرکانس نمونهبرداری 44100 هرتز و فرمت PCM 16 بیت را برای دستیابی به کیفیت استاندارد CD پیکربندی کرد.
در طول ضبط صدا ممکن است وقفههای سیستمی رخ دهد: تماس ورودی، زنگ هشدار، اعلان از برنامه دیگر. در iOS AVAudioSessionDelegate beginInterruption و endInterruption را مدیریت میکند. در Android AudioManager.OnAudioFocusChangeListener برنامه را از دست دادن یا بازگشت فوکوس صوتی مطلع میکند. مدیریت صحیح وقفهها امکان حفظ ضبط در رویدادهای غیرمنتظره و جلوگیری از از دست رفتن دادهها را فراهم میکند. توصیه میشود در زمان از دست دادن فوکوس ضبط را متوقف کرده و پس از بازگشت آن با اطلاع کاربر از سر گرفته شود.
بهینهسازی ضبط صدا شامل پیکربندی فرکانس نمونهبرداری، اندازه بافر و فرمت کدگذاری است. برای پیامهای صوتی فرکانس 44100 هرتز و کانال مونو کافی است. برای تشخیص گفتار ممکن است فرکانس 16000 هرتز مورد نیاز باشد.
در 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید