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

Flutter中如何切换扬声器与耳机?hmssdk_flutter iOS不支持该功能

解决iOS端扬声器与听筒切换的方案

针对hmssdk_flutter iOS端不支持音频路由切换的问题,你可以通过以下两种方式实现:

1. 原生代码桥接(自定义实现)

直接在iOS原生层使用AVFoundation框架控制音频路由,通过Flutter MethodChannel与Dart层通信:

iOS端(Swift代码)

在iOS项目中添加音频路由控制方法:

import AVFoundation
import Flutter

class AudioRouteManager {
    static func setupMethodChannel(controller: FlutterViewController) {
        let channel = FlutterMethodChannel(name: "com.example.audio_route", binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler { call, result in
            if call.method == "toggleAudioRoute" {
                guard let useSpeaker = call.arguments as? Bool else {
                    result.error("INVALID_ARGUMENT", "Missing boolean argument", nil)
                    return
                }
                self.toggleRoute(toSpeaker: useSpeaker)
                result.success(nil)
            } else {
                result.notImplemented()
            }
        }
    }
    
    private static func toggleRoute(toSpeaker: Bool) {
        let session = AVAudioSession.sharedInstance()
        do {
            let options: AVAudioSession.CategoryOptions = toSpeaker ? .defaultToSpeaker : .allowBluetooth
            try session.setCategory(.playAndRecord, mode: .voiceChat, options: options)
            try session.setActive(true)
        } catch {
            print("Audio route toggle error: \(error.localizedDescription)")
        }
    }
}

然后在AppDelegate.swift的didFinishLaunchingWithOptions中注册MethodChannel:

if let controller = window?.rootViewController as? FlutterViewController {
    AudioRouteManager.setupMethodChannel(controller: controller)
}

Flutter端(Dart代码)

调用原生方法:

import 'package:flutter/services.dart';

class AudioRouteHelper {
  static const MethodChannel _channel = MethodChannel('com.example.audio_route');

  static Future<void> toggleAudioOutput(bool useSpeaker) async {
    try {
      await _channel.invokeMethod('toggleAudioRoute', useSpeaker);
    } on PlatformException catch (e) {
      print('Error toggling audio route: ${e.message}');
    }
  }
}

2. 使用第三方Flutter包

可以借助audio_session包来统一管理音频会话,实现路由切换:

步骤1:添加依赖

在pubspec.yaml中添加:

dependencies:
  audio_session: ^0.1.16

步骤2:实现切换逻辑

import 'package:audio_session/audio_session.dart';

Future<void> switchAudioOutput(bool useSpeaker) async {
  final session = await AudioSession.instance;
  // 配置音频会话,与hmssdk的音频模式兼容
  await session.configure(AudioSessionConfiguration(
    avAudioSessionCategory: AVAudioSessionCategory.playAndRecord,
    avAudioSessionCategoryOptions: useSpeaker 
        ? AVAudioSessionCategoryOptions.defaultToSpeaker 
        : AVAudioSessionCategoryOptions.allowBluetooth,
    avAudioSessionMode: AVAudioSessionMode.voiceChat,
  ));
}

注意事项

  • 确保iOS项目的Info.plist中添加麦克风权限描述:
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风进行语音通话</string>
  • 切换音频路由时,需避免与hmssdk_flutter的音频会话配置冲突,建议在初始化hmssdk后再执行路由切换操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:15:45