Flutter/just_audio:如何识别音频播放的设备类型?
识别音频播放设备类型的实现方案
目前just_audio、audio_service和just_audio_background这三个包本身没有提供直接识别当前音频输出设备类型的API,需要通过Flutter的**原生通道(MethodChannel/EventChannel)**分别调用iOS和Android的系统API来实现,以下是具体方案:
Android 端实现
核心依赖系统API
通过AudioManager获取当前音频输出设备信息,关键常量对应设备类型:DEVICE_TYPE_BUILTIN_SPEAKER:本机扬声器DEVICE_TYPE_BLUETOOTH_A2DP:蓝牙音频设备DEVICE_TYPE_AUTOMOTIVE:Android Auto车载设备DEVICE_TYPE_WIRED_HEADPHONES:有线耳机等
具体步骤
- 在Android原生代码中,获取
AudioManager实例:val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager - 调用
getDevices(AudioManager.GET_DEVICES_OUTPUTS)获取所有活跃输出设备 - 遍历设备列表,根据
device.type判断当前主要输出设备类型 - 通过
MethodChannel将设备类型标识(如字符串"bluetooth"、"built_in"、"automotive")返回给Flutter端 - 注意:Android 12及以上需要申请
BLUETOOTH_CONNECT权限才能获取蓝牙设备信息
- 在Android原生代码中,获取
后台监听
注册AudioManager.ACTION_AUDIO_BECOMING_NOISY广播或监听AudioManager.OnAudioFocusChangeListener,当音频路由变化时主动通知Flutter端更新设备状态
iOS 端实现
核心依赖系统API
利用AVAudioSession的currentRoute属性获取输出端口类型,关键端口标识:AVAudioSessionPortBuiltInSpeaker:本机扬声器AVAudioSessionPortBluetoothA2DP:蓝牙音频设备AVAudioSessionPortCarPlay:CarPlay车载设备AVAudioSessionPortHeadphones:有线耳机
具体步骤
- 在iOS原生代码中,获取
AVAudioSession实例:let session = AVAudioSession.sharedInstance() - 访问
session.currentRoute.outputs获取所有输出端口,取首个活跃端口的portType判断设备类型 - 通过
MethodChannel将设备类型标识返回给Flutter端 - 注册
AVAudioSession.routeChangeNotification通知,监听音频路由变化,实时同步设备状态到Flutter
- 在iOS原生代码中,获取
结合 audio_service 后台场景
在后台播放状态下,原生端的设备监听逻辑依然有效,可以将路由变化事件通过EventChannel推送给Flutter的audio_service回调,确保后台也能实时获取当前播放设备类型的变化。
内容的提问来源于stack exchange,提问作者or9ob
相关产品推荐
相关产品推荐

