如何在Kotlin中调用蓝牙耳机麦克风录制音频
蓝牙耳机麦克风在Android录音中的访问问题解决方法
你的蓝牙耳机能正常通话,说明系统层面已能识别并使用其麦克风,问题出在录音代码的音频源配置或设备偏好设置上。以下是针对性解决方案:
1. 确保权限配置完整
除基础的RECORD_AUDIO权限外,需根据Android版本补充对应权限:
- Android 10(API 29)及以上:添加
ACCESS_MEDIA_LOCATION权限(用于媒体文件定位) - Android 12(API 31)及以上:添加
BLUETOOTH_CONNECT权限(用于主动连接蓝牙音频设备)
在AndroidManifest.xml中声明:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" android:maxSdkVersion="33" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" />
同时要动态申请这些权限,确保用户授权后再启动录音。
2. 更换适配蓝牙的音频源
你当前使用的MediaRecorder.AudioSource.UNPROCESSED对蓝牙设备兼容性较差,建议替换为以下两种音频源之一:
MediaRecorder.AudioSource.VOICE_COMMUNICATION:系统专为语音通话优化的音频源,会自动优先使用蓝牙麦克风(与通话时的音频路径一致)MediaRecorder.AudioSource.MIC:通用麦克风源,多数场景下也能识别蓝牙设备,但优先级低于前者
3. 强制指定蓝牙音频输入设备(Android 11+可选)
若更换音频源后仍不生效,可通过AudioManager主动指定蓝牙设备作为输入源:
import android.media.AudioManager import android.media.AudioDeviceInfo // 启动录音前执行该逻辑 val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager val bluetoothDevices = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS) .filter { it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO || it.type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP } if (bluetoothDevices.isNotEmpty()) { audioManager.setPreferredDevice(bluetoothDevices.first()) }
修改后的完整录音类代码
package com.plcoding.audiorecorder.record import android.content.Context import android.media.AudioManager import android.media.AudioDeviceInfo import android.media.MediaRecorder import android.os.Build import java.io.File class AndroidAudioRecorder( private val context: Context ): AudioRecorder { private var recorder: MediaRecorder? = null private fun createRecorder(): MediaRecorder { return if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { MediaRecorder(context) } else MediaRecorder() } override fun start(outputFile: File) { // 优先指定蓝牙输入设备(Android 11+) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS).forEach { device -> if (device.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO || device.type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) { audioManager.setPreferredDevice(device) return@forEach } } } createRecorder().apply { // 使用适配通话的音频源 setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION) setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) setAudioEncoder(MediaRecorder.AudioEncoder.AAC) setOutputFile(outputFile.absolutePath) // 直接用文件路径更简洁,避免额外流操作 prepare() start() recorder = this } } override fun stop() { recorder?.stop() recorder?.reset() recorder = null } }
额外注意事项
- 启动录音前必须确保已获取所有必要权限,否则会直接崩溃
- 测试时请确认蓝牙耳机处于连接状态,且已设置为系统音频输入设备
内容的提问来源于stack exchange,提问作者dafsdafda
相关产品推荐
相关产品推荐

