基于Flutter的设备多应用音频并发管控方案咨询
问题结论:Flutter跨平台层无法直接实现该需求
该需求涉及系统级音频策略修改、第三方应用音频状态管控,属于系统底层开放能力,Flutter官方没有提供对应跨平台API,所有通用Flutter音频库均遵循系统原生音频焦点逻辑,无法突破系统默认规则实现跨应用音频管控。
可行替代方案
需要基于Flutter的Platform Channel调用原生侧代码实现,两个系统的开放能力差异较大:
- Android平台实现方案
Android系统权限相对开放,绝大多数需求可通过原生代码实现,但部分能力需要申请特殊权限:注意:Android 10及以上版本对音频管控权限做了严格限制,部分定制ROM可能额外限制权限获取
- 多应用音频同时输出:原生侧创建AudioAttributes时设置
CONTENT_TYPE_MUSIC,请求音频焦点时避开AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE标志,同时配置audioManager.setMediaVolumeControlStream(AudioManager.STREAM_MUSIC),即可实现自身应用音频和其他第三方应用音频同时输出的效果。 - 单独管控其他应用音频状态:需要申请
android.permission.MEDIA_CONTENT_CONTROL权限,该权限仅对系统级应用、默认音乐控制类应用开放,普通三方应用需要用户手动在系统设置中开启特殊权限后才能使用。
- 多应用音频同时输出:原生侧创建AudioAttributes时设置
- iOS平台实现方案
iOS沙箱机制极其严格,仅能实现部分需求:- 多应用音频同时输出:原生侧配置AVAudioSession的category为
AVAudioSessionCategoryPlayback,mode为AVAudioSessionModeDefault,options设置为.mixWithOthers即可实现自身应用和其他应用音频同时播放。 - 管控其他应用音频状态、获取其他应用音频播放列表:iOS无公开API支持该能力,非越狱设备完全无法实现。
- 多应用音频同时输出:原生侧配置AVAudioSession的category为
补充疑问解答
1. 是否可通过Intents控制其他应用的音频暂停、恢复?
仅Android平台有限支持:
- 系统层面的媒体按钮广播Intent可以发送,比如发送
Intent(Intent.ACTION_MEDIA_BUTTON)并携带KeyEvent.KEYCODE_MEDIA_PAUSE/KEYCODE_MEDIA_PLAY事件,注册了媒体按钮监听的音乐应用会响应这个广播,实现暂停/恢复。 - 该方案存在局限性:部分应用未注册媒体按钮监听不会响应,且Android 12及以上版本对媒体按钮广播的权限做了限制,仅当前活跃的媒体应用会响应广播,无法精准控制指定应用的音频状态。
- iOS不存在Intent组件,没有对应实现能力。
2. 如何在自身应用内获取当前正在播放音频的应用列表?
仅Android平台可实现:
- 原生侧通过
MediaSessionManager获取活跃的媒体会话列表,调用getActiveSessions(ComponentName notificationListener)即可获取所有正在播放音频的应用包名、播放状态等信息。 - 该能力需要用户授予应用
android.permission.BIND_NOTIFICATION_LISTENER_SERVICE通知监听权限,用户需要手动在系统设置的通知使用权页面开启对应权限才可生效。 - iOS无公开API支持获取其他应用的音频播放状态。
内容的提问来源于stack exchange,提问作者Hamza Kaleem
相关产品推荐
相关产品推荐

