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 ในไฟล์ manifest หากไม่มีการประกาศนี้ การขออนุญาตขณะรันไทม์จะไม่มีผลและแอปพลิเคชันจะไม่สามารถเข้าถึงไมโครโฟนได้
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
CAPTURE_AUDIO_OUTPUT เป็นสิทธิ์ของระบบที่แอปพลิเคชันของบุคคลที่สามไม่สามารถใช้ได้ สิทธิ์นี้ใช้โดยแอปพลิเคชันระบบเท่านั้นเพื่อจับเอาต์พุตเสียง แอปพลิเคชันทั่วไปต้องการเพียง RECORD_AUDIO สำหรับการบันทึกจากไมโครโฟน
หลังจากประกาศใน manifest แล้ว จำเป็นต้องทำการขออนุญาตขณะรันไทม์ ลองพิจารณาตัวอย่างโดยใช้ 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 การรู้จำคำพูดอาจต้องได้รับสิทธิ์เพิ่มเติมสำหรับบริการรู้จำ (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 เพื่อกำหนดค่าความหน่วงในการบันทึก บัฟเฟอร์ขนาดเล็กจะลดความหน่วงแต่เพิ่มภาระของ CPU บน Android AudioRecord.getMinBufferSize จะคืนค่าขนาดบัฟเฟอร์ขั้นต่ำสำหรับพารามิเตอร์ที่กำหนด ขอแนะนำให้ใช้บัฟเฟอร์ไม่น้อยกว่าค่าขั้นต่ำนี้เพื่อป้องกันการสูญเสียข้อมูลเมื่อบันทึกภายใต้ภาระระบบสูง
แนวปฏิบัติที่ดีที่สุด สำหรับ Microphone Permission มุ่งเน้นการเพิ่มความไว้วางใจของผู้ใช้และการปฏิบัติตามข้อกำหนดของแพลตฟอร์ม
ก่อนขอ Microphone Permission ให้แสดงหน้าจอที่อธิบายว่าเหตุใดแอปจึงต้องใช้ไมโครโฟนและจะใช้การบันทึกอย่างไร ระบุว่าเสียงถูกส่งไปยังเซิร์ฟเวอร์หรือประมวลผลในเครื่อง ผู้ใช้มีแนวโน้มที่จะอนุญาตการเข้าถึงมากขึ้นหากพวกเขาเข้าใจว่าการบันทึกไม่ได้ออกจากอุปกรณ์ การประมวลผลในเครื่อง (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 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม