Microphone Permission là quyền hệ thống cần thiết để ứng dụng truy cập vào micrô của thiết bị. Quyền này được yêu cầu để ghi âm, tin nhắn thoại, cuộc gọi video và nhận dạng giọng nói. Theo Apple Developer Documentation, 2024, tất cả các ứng dụng sử dụng tính năng thu âm đều phải yêu cầu sự đồng ý rõ ràng của người dùng thông qua hộp thoại hệ thống.
Những điểm chính
Microphone Permission là cơ chế bảo vệ quyền riêng tư ngăn chặn việc ghi âm trái phép từ micrô của thiết bị. Các nền tảng di động coi micrô là một trong những tài nguyên nhạy cảm nhất, vì ghi âm có thể thu được các cuộc trò chuyện cá nhân, môi trường xung quanh và thông tin bảo mật.
Android phân loại RECORD_AUDIO là quyền nguy hiểm, còn iOS yêu cầu bắt buộc thêm khóa NSMicrophoneUsageDescription vào Info.plist. Trên cả hai nền tảng, yêu cầu được thực hiện tại thời gian chạy và người dùng có thể thu hồi quyền bất kỳ lúc nào thông qua cài đặt hệ thống. Chỉ báo hệ thống khi ghi âm (chấm màu cam trên iOS, chỉ báo màu xanh lá trên Android 12+) báo hiệu cho người dùng rằng ứng dụng đang sử dụng micrô tại thời điểm đó.
Theo nghiên cứu của Pew Research Center (2024), 54% người dùng thiết bị di động đã từ chối quyền truy cập micrô cho ứng dụng ít nhất một lần. Lý do chính là không hiểu tại sao ứng dụng cần ghi âm. Vì vậy, nhà phát triển cần giải thích mục đích sử dụng micrô một cách minh bạch nhất có thể.
Quyền micrô trên Android được yêu cầu bằng cách khai báo RECORD_AUDIO trong tệp kê khai (manifest) và thực hiện yêu cầu thời gian chạy trong mã ứng dụng. Từ Android 10, quyền truy cập micrô được điều chỉnh thêm bởi các hạn chế đối với ứng dụng chạy nền.
Bước đầu tiên là khai báo quyền RECORD_AUDIO trong tệp kê khai. Nếu không có khai báo này, yêu cầu thời gian chạy sẽ không có hiệu lực và ứng dụng sẽ không thể truy cập micrô.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
CAPTURE_AUDIO_OUTPUT là quyền hệ thống không khả dụng cho các ứng dụng của bên thứ ba. Nó chỉ được sử dụng bởi các ứng dụng hệ thống để thu âm đầu ra. Các ứng dụng thông thường chỉ cần RECORD_AUDIO để ghi âm từ micrô.
Sau khi khai báo trong tệp kê khai, bạn cần thực hiện yêu cầu thời gian chạy. Hãy xem xét ví dụ sử dụng AudioRecord để ghi âm từ micrô.
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()
// Đang ghi dữ liệu âm thanh vào bộ đệm
}
Điều quan trọng là xử lý đúng vòng đời ghi âm. Khi ứng dụng chuyển sang nền trên Android 9 trở lên, việc ghi âm từ micrô có thể bị tạm dừng bởi hệ thống. Từ Android 10, quyền truy cập micrô nền bị hạn chế thêm: ứng dụng trong nền không thể bắt đầu ghi âm và việc ghi âm đang hoạt động sẽ bị tạm dừng. Ghi âm trong nền yêu cầu MediaProjection hoặc Service có thông báo.
Quyền micrô trên iOS được cấu hình thông qua khóa NSMicrophoneUsageDescription trong Info.plist và gọi phương thức AVAudioSession.requestRecordPermission. Apple yêu cầu giải thích bắt buộc về lý do sử dụng micrô trong hộp thoại yêu cầu.
Khóa NSMicrophoneUsageDescription là bắt buộc đối với bất kỳ ứng dụng nào yêu cầu quyền truy cập micrô. Nếu không có nó, ứng dụng sẽ bị treo khi cố gắng ghi âm.
<key>NSMicrophoneUsageDescription</key>
<string>Ứng dụng cần quyền truy cập micrô để ghi ghi chú thoại và gửi tin nhắn âm thanh.</string>
Việc yêu cầu quyền truy cập micrô trên iOS được thực hiện thông qua AVAudioSession. Sau khi nhận được phản hồi, ứng dụng cấu hình phiên âm thanh và bắt đầu ghi âm.
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)")
}
}
Trên iOS 14 trở lên, ứng dụng sử dụng micrô sẽ hiển thị chỉ báo màu cam trên thanh trạng thái. Người dùng có thể thấy ứng dụng nào đang ghi âm tại thời điểm đó. Nếu ứng dụng sử dụng micrô trong nền mà không có lý do chính đáng, Apple có thể từ chối bản cập nhật. AVAudioSession cho phép bạn cấu hình danh mục và chế độ của phiên âm thanh, xác định hành vi của ứng dụng khi chuyển sang nền.
Các kịch bản sử dụng micrô trong ứng dụng di động rất đa dạng: từ ghi âm giọng nói đơn giản đến xử lý luồng âm thanh phức tạp theo thời gian thực.
Ứng dụng nhắn tin và ghi chú sử dụng micrô để ghi lại tin nhắn thoại. Trong trường hợp này, Microphone Permission được yêu cầu khi nhấn nút ghi âm. Sau khi hoàn tất ghi âm, điều quan trọng là dừng phiên âm thanh để các ứng dụng khác có thể sử dụng micrô. AVAudioSession trên iOS và AudioManager trên Android quản lý tiêu điểm âm thanh.
Các ứng dụng có đầu vào giọng nói (tìm kiếm, đọc chính tả, trợ lý giọng nói) sử dụng micrô kết hợp với API nhận dạng giọng nói. Trên Android, đó là SpeechRecognizer từ android.speech, trên iOS — SFSpeechRecognizer từ framework Speech. Nhận dạng giọng nói có thể yêu cầu quyền bổ sung cho các dịch vụ nhận dạng (SPEECH trên Android, SFSpeechRecognizer.requestAuthorization trên iOS).
Các ứng dụng gọi video (WebRTC, Zoom, Telegram) yêu cầu Microphone Permission cùng với Camera Permission. Trong bối cảnh này, điều quan trọng là yêu cầu cả hai quyền một cách tuần tự, không đồng thời, để người dùng không bị quá tải bởi các hộp thoại. WebRTC sử dụng getUserMedia để thu âm thanh và video, nhưng trên nền tảng di động, cần có quyền hệ thống trước tiên.
Để ghi âm chất lượng cao, bạn cần cấu hình đúng các tham số phiên âm thanh. Trên iOS, danh mục .playAndRecord cho phép phát lại và ghi âm đồng thời. Trên Android, chọn AudioSource.MIC cung cấp khả năng thu từ micrô chính, trong khi AudioSource.VOICE_COMMUNICATION tối ưu hóa ghi âm cho giao tiếp thoại. Ngoài ra, bạn có thể đặt tần số lấy mẫu 44100 Hz và định dạng PCM 16 bit để đạt chất lượng CD tiêu chuẩn.
Trong quá trình ghi âm, có thể xảy ra gián đoạn hệ thống: cuộc gọi đến, báo thức kích hoạt, thông báo từ ứng dụng khác. Trên iOS, AVAudioSessionDelegate xử lý beginInterruption và endInterruption. Trên Android, AudioManager.OnAudioFocusChangeListener thông báo cho ứng dụng về việc mất hoặc lấy lại tiêu điểm âm thanh. Xử lý gián đoạn đúng cách cho phép lưu bản ghi trong các sự kiện bất ngờ và tránh mất dữ liệu. Bạn nên tạm dừng ghi âm khi mất tiêu điểm và tiếp tục sau khi tiêu điểm quay lại kèm thông báo cho người dùng.
Tối ưu hóa thu âm bao gồm cấu hình tần số lấy mẫu, kích thước bộ đệm và định dạng mã hóa. Đối với tin nhắn thoại, tần số 44100 Hz và kênh đơn là đủ. Đối với nhận dạng giọng nói, có thể cần tần số 16000 Hz.
Trên iOS, sử dụng AVAudioSession.setPreferredIOBufferDuration để cấu hình độ trễ ghi âm. Bộ đệm nhỏ hơn giảm độ trễ nhưng tăng tải CPU. Trên Android, AudioRecord.getMinBufferSize trả về kích thước bộ đệm tối thiểu cho các tham số đã cho. Bạn nên sử dụng bộ đệm không nhỏ hơn mức tối thiểu này để tránh mất dữ liệu khi ghi âm dưới tải hệ thống cao.
Thực tiễn tốt nhất cho Microphone Permission nhằm tăng niềm tin của người dùng và đáp ứng các yêu cầu của nền tảng.
Trước khi yêu cầu Microphone Permission, hãy hiển thị màn hình giải thích tại sao ứng dụng cần micrô và bản ghi sẽ được sử dụng như thế nào. Cho biết âm thanh được truyền đến máy chủ hay xử lý cục bộ. Người dùng có nhiều khả năng cấp quyền hơn nếu họ hiểu rằng bản ghi không rời khỏi thiết bị. Xử lý cục bộ (ASR trên thiết bị) là một lập luận mạnh mẽ cho sự tin tưởng.
Nếu ứng dụng không yêu cầu ghi âm trong nền, hãy đảm bảo dừng micrô khi chuyển sang nền. Điều này không chỉ tiết kiệm pin mà còn ngăn phản ứng tiêu cực của người dùng khi thấy chỉ báo ghi âm. Trên iOS, sử dụng các phương thức UIApplicationDelegate applicationDidEnterBackground để tạm dừng ghi âm. Trên Android, xử lý onPause và onStop trong Activity hoặc Service.
Hiển thị chỉ báo ghi âm của riêng bạn (biểu tượng micrô hoạt hình hoặc dạng sóng) trong khi thu âm. Điều này thông báo cho người dùng rằng micrô đang hoạt động và giảm nguy cơ phản ứng tiêu cực. Apple và Google khuyên bạn nên nhân đôi chỉ báo hệ thống bằng thành phần giao diện người dùng của riêng mình để đạt độ minh bạch tối đa.
Câu hỏi thường gặp
Không, quyền micrô chỉ cần thiết cho việc thu âm từ micrô. Phát âm thanh qua loa hoặc tai nghe không yêu cầu Microphone Permission. Để phát lại, chỉ cần cấu hình phiên âm thanh trên iOS hoặc AudioTrack trên Android.
Sử dụng ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO). Phương thức trả về PackageManager.PERMISSION_GRANTED hoặc PERMISSION_DENIED. Ngoài ra, hãy kiểm tra xem micrô có khả dụng trên thiết bị hay không qua PackageManager.hasSystemFeature.
Đưa ra kịch bản thay thế: nhập văn bản thay vì giọng nói, gửi tin nhắn không có âm thanh, xem video không có tiếng. Nếu tính năng nhập giọng nói là quan trọng, hãy hiển thị màn hình hướng dẫn cách bật quyền trong cài đặt hệ thống và nút để điều hướng đến đó.
Từ Android 12, ứng dụng trong nền không thể truy cập micrô. Việc ghi âm đang hoạt động sẽ bị tạm dừng khi chuyển sang nền. Ngoài ra, chỉ báo Privacy Chip đã xuất hiện — biểu tượng màu xanh lá trên thanh trạng thái cho thấy ứng dụng đang sử dụng micrô.
Các lý do phổ biến nhất: thiếu khóa NSMicrophoneUsageDescription, mô tả lý do không cụ thể (“để cải thiện dịch vụ” thay vì “để ghi tin nhắn thoại”), yêu cầu quyền mà không có hành động rõ ràng của người dùng hoặc sử dụng micrô trong nền mà không có chức năng hợp lý.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm