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

Android中audioManager.startBluetoothSco()无法工作的问题求助

问题分析与解决方案

核心问题点

你的代码逻辑和配置存在几个关键错误,导致SCO连接始终无法建立:

  • 广播Action配置错误:你使用的android.media.extra.SCO_AUDIO_STATE不是合法的广播Action,旧版本系统对应正确Action为android.media.ACTION_SCO_AUDIO_STATE_CHANGED,Android 10+推荐使用android.media.ACTION_SCO_AUDIO_STATE_UPDATED。
  • 逻辑顺序颠倒:你试图在SCO连接成功后再调用startBluetoothSco(),但正确流程是先主动启动SCO连接,才能监听到状态变化。
  • 缺少必要权限:蓝牙音频录制需要蓝牙和录音相关权限,未申请会被系统拒绝连接请求。
  • 模式设置时机错误:MODE_IN_CALL需在启动SCO前设置,且要确保蓝牙已开启。

修正后的代码与配置

1. 添加必要权限到Manifest

在<manifest>标签下补充权限:

<!-- 基础蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- Android 12+ 蓝牙连接权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" />
<!-- 声明硬件特性 -->
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
<uses-feature android:name="android.hardware.microphone" android:required="true" />

2. 修正广播Receiver配置

保留正确的Action过滤:

<receiver
    android:name=".recorder.CallReceiver"
    android:exported="true">
    <intent-filter>
        <!-- 兼容旧版本系统 -->
        <action android:name="android.media.ACTION_SCO_AUDIO_STATE_CHANGED" />
        <!-- Android 10+ 推荐使用 -->
        <action android:name="android.media.ACTION_SCO_AUDIO_STATE_UPDATED" />
    </intent-filter>
</receiver>

3. 修正Receiver逻辑代码

public class CallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action == null) return;

        // 获取SCO连接状态
        int scoState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, AudioManager.SCO_AUDIO_STATE_ERROR);
        
        switch (scoState) {
            case AudioManager.SCO_AUDIO_STATE_CONNECTED:
                // SCO连接成功,可启动录音逻辑
                Log.d("SCO", "蓝牙SCO连接成功");
                break;
            case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
                Log.d("SCO", "蓝牙SCO连接断开");
                break;
            case AudioManager.SCO_AUDIO_STATE_ERROR:
                Log.e("SCO", "蓝牙SCO连接出错");
                break;
        }
    }
}

4. 主动发起SCO连接的代码(在Activity/Service中)

需在合适时机(如蓝牙设备连接后、用户触发录音时)主动启动SCO:

private void initBluetoothSco() {
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    
    // 检查蓝牙SCO是否可用
    if (!audioManager.isBluetoothScoAvailableOffCall()) {
        Toast.makeText(this, "蓝牙音频不可用", Toast.LENGTH_SHORT).show();
        return;
    }

    // 设置音频模式为通话模式
    audioManager.setMode(AudioManager.MODE_IN_CALL);
    // 开启蓝牙SCO
    audioManager.setBluetoothScoOn(true);
    // 启动SCO连接
    audioManager.startBluetoothSco();
}

// 无需使用时释放资源
private void releaseBluetoothSco() {
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.stopBluetoothSco();
    audioManager.setBluetoothScoOn(false);
    audioManager.setMode(AudioManager.MODE_NORMAL);
}

额外注意事项

  • Android 6+需主动申请RECORD_AUDIO和蓝牙相关的运行时权限,否则SCO连接会失败。
  • 部分设备要求蓝牙设备(如蓝牙耳机)已配对并连接,才能成功建立SCO连接。
  • 录音逻辑应放在Service中执行,避免在BroadcastReceiver内处理长时间操作。

内容的提问来源于stack exchange,提问作者Taki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:15:54