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

Android 10及以下设备通话时首次无法从蓝牙切换至听筒问题问询

Android 10及以下蓝牙转听筒首次切换失败问题修复

问题概述

通话时初始音频路由为蓝牙耳机,首次尝试切换至听筒模式失败,第二次切换正常;蓝牙转扬声器无异常。该问题仅出现在Android 10及以下设备,Android 11及以上设备无此现象。

影响设备

  • 搭载Android 10系统的设备

复现条件

  • 已完成蓝牙设备配对
  • 通话状态下音频初始路由为蓝牙耳机

复现步骤

  1. 启动应用并登录
  2. 接听来电进入通话界面
  3. 当前音频路径为蓝牙
  4. 点击语音切换按钮选择听筒选项
  5. 音频仍保持蓝牙路由,未切换至听筒

原实现代码

原通过SetEarPieceOn方法实现听筒切换,代码如下:

private AudioManager _audioManager;

public AudioManagerService() 
{ 
    _audioManager = (AudioManager)Application.Context.GetSystemService(Android.Content.Context.AudioService);
    _audioManager.SpeakerphoneOn = false; 
    _audioManager.BluetoothScoOn = false; 
    _audioManager.StopBluetoothSco(); 
}  

public bool SetEarPieceOn() 
{       
    _audioManager.StopBluetoothSco(); 
    _audioManager.BluetoothScoOn = false; 
    _audioManager.SpeakerphoneOn = false; 
    return !_audioManager.SpeakerphoneOn; 
}

临时解决方案(Workaround)

通过先切换至扬声器再切回听筒的方式临时解决,但并非最优方案:

public bool SetEarPieceOn() 
{ 
    if (AppRes.OSVersion <= 10) 
    { 
        _audioManager.SpeakerphoneOn = true; // 临时修复:蓝牙通话时首次切听筒失败问题
    } 
    _audioManager.StopBluetoothSco(); 
    _audioManager.BluetoothScoOn = false; 
    _audioManager.SpeakerphoneOn = false; 
    return !_audioManager.SpeakerphoneOn; 
}

问题分析与优化方案

Android 10及以下系统中,直接关闭蓝牙SCO并禁用扬声器时,系统可能未正确触发音频路由切换至听筒的逻辑,需明确告知系统当前通话场景的音频路由优先级。

更合理的修复方案:

  1. 确保设置正确的音频模式为MODE_IN_CALL
  2. 显式请求音频焦点并指定通话类音频属性
  3. 强制系统刷新音频路由状态(部分设备需要)

优化后的代码示例:

public bool SetEarPieceOn() 
{ 
    if (AppRes.OSVersion <= 10) 
    {
        // 设置通话专属音频模式
        _audioManager.Mode = Android.Media.AudioMode.InCall;
        // 构建通话类音频属性请求音频焦点
        AudioFocusRequest focusRequest = new AudioFocusRequest.Builder(AudioManager.AudioFocusGain)
            .SetAudioAttributes(new AudioAttributes.Builder()
                .SetUsage(AudioUsageKind.VoiceCommunication)
                .Build())
            .Build();
        _audioManager.RequestAudioFocus(focusRequest);
    }

    _audioManager.StopBluetoothSco(); 
    _audioManager.BluetoothScoOn = false; 
    _audioManager.SpeakerphoneOn = false; 

    // 强制系统刷新音频路由(适配部分Android 10设备)
    if (AppRes.OSVersion <= 10)
    {
        _audioManager.SetMode(Android.Media.AudioMode.InCall);
    }

    return !_audioManager.SpeakerphoneOn; 
}

说明:Android 11+系统已修复此路由切换逻辑问题,无需额外处理。测试验证多个蓝牙设备均存在此问题,排除设备自身故障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:32:49