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

.NET MAUI应用运行后连接蓝牙耳机无法切换音频路由问题求助

问题分析与解决方案

原因说明

你的推测是对的——问题核心在于音频会话仅在应用启动时配置了一次。当应用运行中连接蓝牙耳机,iOS系统不会自动触发音频路由切换,因为:

  1. 初始配置的音频会话只绑定了启动时的设备状态;
  2. 当前代码里的DefaultToSpeaker选项会强制音频默认输出到扬声器,即使蓝牙设备连接后也会优先使用内置扬声器。

解决方案

需要通过监听音频路由变化事件,在蓝牙设备连接/断开时重新配置音频会话,同时调整会话选项确保蓝牙设备优先级。

1. 监听音频路由变化通知

在iOS平台代码中(如App.xaml.cs或页面初始化逻辑)订阅AVAudioSession.RouteChangeNotification,捕捉设备连接事件:

using Foundation;
using AVFoundation;

// 在应用启动或页面初始化时订阅通知
NSNotificationCenter.DefaultCenter.AddObserver(
    AVAudioSession.RouteChangeNotification, 
    AudioRouteChanged
);

2. 实现路由变化回调逻辑

在回调中判断设备连接状态,重新配置音频会话并切换到蓝牙设备:

private void AudioRouteChanged(NSNotification notification)
{
    var userInfo = notification.UserInfo;
    var reasonValue = userInfo[AVAudioSession.RouteChangeReasonKey] as NSNumber;
    if (reasonValue == null) return;

    var changeReason = (AVAudioSessionRouteChangeReason)reasonValue.Int32Value;

    // 仅处理设备连接/断开的场景
    if (changeReason is AVAudioSessionRouteChangeReason.NewDeviceAvailable || 
        changeReason is AVAudioSessionRouteChangeReason.OldDeviceUnavailable)
    {
        // 重新配置音频会话
        SetAudioSession();

        // 主动检测并切换到蓝牙设备
        var session = AVAudioSession.SharedInstance();
        foreach (var output in session.CurrentRoute.Outputs)
        {
            // 匹配蓝牙A2DP(音频播放)或HFP(通话/录音)端口
            if (output.PortType == AVAudioSessionPort.BluetoothA2DP || 
                output.PortType == AVAudioSessionPort.BluetoothHFP)
            {
                session.SetActive(true, out var err);
                if (err != null)
                {
                    // 这里可添加错误日志或提示逻辑
                }
                break;
            }
        }
    }
}

3. 调整音频会话配置

修改原SetAudioSession方法,移除DefaultToSpeaker选项,让系统自动优先选择蓝牙设备:

public bool SetAudioSession()
{
    var audioSession = AVAudioSession.SharedInstance();
    // 移除DefaultToSpeaker,确保蓝牙设备连接后能被优先选用
    var err = audioSession.SetCategory(
        AVAudioSessionCategory.PlayAndRecord, 
        AVAudioSessionCategoryOptions.AllowBluetooth |
        AVAudioSessionCategoryOptions.AllowAirPlay
    );

    if (err != null)
        return false;

    err = audioSession.SetActive(true);
    if (err != null)
        return false;

    return true;
}

4. 补充权限声明

在iOS项目的Info.plist中添加必要的权限描述,确保蓝牙和麦克风权限正常申请:

<key>NSMicrophoneUsageDescription</key>
<string>需要使用麦克风进行音频输入</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要使用蓝牙设备传输音频</string>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:14:57