You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:50:05