You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android蓝牙耳机音频接收问题求助(已添加Manifest权限)

Android 蓝牙耳机接收音频故障排查与解决方案

别着急,我们一步步来拆解问题,从权限配置到代码逻辑,帮你定位蓝牙耳机无法正常接收音频的原因。

一、先确认权限是否配置到位

既然你已经在Manifest里加了权限,先核对下是否覆盖了所有必要项,尤其是不同Android版本的差异:

<!-- 基础蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Android 12+ 新增的蓝牙连接/扫描权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- 音频相关权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />

⚠️ 注意:Android 10及以上,BLUETOOTH_CONNECTRECORD_AUDIO这些权限必须动态申请,只在Manifest里配置是没用的,记得在代码里加运行时权限请求逻辑。

二、强制切换音频路由到蓝牙耳机

很多时候问题出在系统没有自动把音频路由到蓝牙耳机,你可以通过AudioManager手动控制:

示例代码(Kotlin):

val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

// 先判断蓝牙耳机是否已连接
val isBtConnected = audioManager.isBluetoothA2dpOn || audioManager.isBluetoothScoOn

if (isBtConnected) {
    // 分场景切换:SCO适合语音通话,A2DP适合媒体音频
    audioManager.startBluetoothSco()
    audioManager.isBluetoothScoOn = true
    // 媒体音频场景开启A2DP路由
    audioManager.setBluetoothA2dpOn(true)
}
  • SCO(同步连接模式):用于语音通话、语音识别等低延迟场景;
  • A2DP(高级音频分发协议):用于音乐、视频等高质量媒体音频播放。

三、检查音频播放/录制代码的适配性

如果是播放音频:别在MediaPlayerAudioTrack里强制指定扬声器输出,比如不要硬编码限制音频流类型,让系统自动路由即可。
如果是通过蓝牙耳机麦克风录制音频:确保音频来源设置正确,系统会优先使用蓝牙麦(如果已连接),示例代码如下:

val recorder = MediaRecorder().apply {
    setAudioSource(MediaRecorder.AudioSource.DEFAULT) // 或直接用MediaRecorder.AudioSource.MIC
    setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
    setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
    setOutputFile(yourOutputFilePath)
    prepare()
    start()
}

四、常见坑点排查

  • 蓝牙设备协议支持:有些廉价蓝牙耳机只支持通话(SCO),不支持媒体音频(A2DP),可以在系统蓝牙设置里查看设备详情,确认「媒体音频」已开启;
  • 系统全局设置:先手动在系统设置里把音频输出切换到蓝牙耳机,排除APP设置被系统覆盖的可能;
  • Android版本差异:Android 12+对蓝牙后台访问限制更严,若APP在后台运行,可能需要额外处理权限逻辑;
  • 蓝牙连接状态监听:如果你的APP没有监听蓝牙连接/断开的广播,可能会出现设备连接后没有及时切换音频路由的情况,可以注册ACTION_BLUETOOTH_A2DP_STATE_CHANGED广播来触发路由切换。

如果上面的步骤都试过还是不行,可以把你的音频初始化、蓝牙相关代码片段贴出来,我帮你精准定位问题~


内容的提问来源于stack exchange,提问作者Saif Al-Bashiti

火山引擎 最新活动