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 في البيان (manifest) وطلب وقت التشغيل في كود التطبيق. بدءًا من 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 يديران تركيز الصوت.
تستخدم التطبيقات ذات الإدخال الصوتي (البحث، الإملاء، المساعدات الصوتية) الميكروفون جنبًا إلى جنب مع واجهات برمجة تطبيقات التعرف على الكلام. على Android، هذا هو SpeechRecognizer من android.speech، على iOS — SFSpeechRecognizer من إطار Speech. قد يتطلب التعرف على الكلام إذنًا إضافيًا لخدمات التعرف (SPEECH على Android، SFSpeechRecognizer.requestAuthorization على iOS).
تطبيقات مكالمات الفيديو (WebRTC، Zoom، Telegram) تطلب Microphone Permission بالتزامن مع Camera Permission. في هذا السياق، من المهم طلب كلا الإذنين بشكل تسلسلي وليس في وقت واحد، حتى لا يتم إرهاق المستخدم بالحوارات. 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، اعرض شاشة تشرح لماذا يحتاج التطبيق إلى الميكروفون وكيف سيتم استخدام التسجيل. وضح ما إذا كان الصوت يُنقل إلى الخادم أو يُعالج محليًا. يوافق المستخدمون على الوصول بشكل أكبر إذا فهموا أن التسجيل لا يغادر الجهاز. المعالجة المحلية (ASR على الجهاز) هي حجة قوية للثقة.
إذا كان التطبيق لا يتطلب تسجيل الصوت في الخلفية، تأكد من إيقاف الميكروفون عند الانتقال إلى الخلفية. هذا لا يوفر البطارية فحسب، بل يمنع أيضًا رد فعل سلبي من المستخدم عند رؤية مؤشر التسجيل. على iOS، استخدم طرق UIApplicationDelegate applicationDidEnterBackground لإيقاف التسجيل مؤقتًا. على Android، تعامل مع onPause و onStop في Activity أو Service.
اعرض مؤشر التسجيل الخاص بك (أيقونة ميكروفون متحركة أو موجة صوتية) أثناء التقاط الصوت. هذا يخبر المستخدم أن الميكروفون نشط ويقلل من خطر رد الفعل السلبي. توصي Apple و Google بتكرار مؤشر النظام بعنصر واجهة مستخدم خاص بك لتحقيق أقصى شفافية.
الأسئلة الشائعة
لا، إذن الميكروفون مطلوب فقط لالتقاط الصوت من الميكروفون. تشغيل الصوت عبر مكبر الصوت أو سماعات الرأس لا يتطلب 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. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا