Skip to content

feat(ohos): 支持允许和其他应用同时播放 - #192

Closed
L-Trump wants to merge 1 commit into
dev4harmony:ohosfrom
L-Trump:feat/ohos-concurrent-playback
Closed

L-Trump wants to merge 1 commit into
dev4harmony:ohosfrom
L-Trump:feat/ohos-concurrent-playback

Conversation

@L-Trump

@L-Trump L-Trump commented Oct 7, 2026

Copy link
Copy Markdown

背景

鸿蒙端在使用小艺输入法或其他应用进行语音输入时,音频焦点切换会打断正在播放的视频/直播。希望提供类似音乐应用的可选混音行为,同时保留默认策略和系统强制中断。

更改

  • 在「设置 → 鸿蒙特色功能(实验性)」新增 允许和其他应用同时播放,默认关闭,使用现有 Hive 设置持久化。
  • 开启后使用原生应用级 AudioSession 的 CONCURRENCY_MIX_WITH_OTHERS,关闭时使用 CONCURRENCY_PAUSE_OTHERS。设置在下一次播放/恢复播放或刷新播放源时应用,设置项已提示这一点。
  • 新增专用 HarmonyOS MethodChannel/FlutterPlugin,串行执行激活与停用请求,复用一个中断监听器,返回原生错误,并在 engine detach 时等待在途请求后清理会话。
  • 视频和直播共用控制器在 mpv/OHAudio 播放前等待会话激活;双击播放/暂停也经过同一入口。暂停、销毁或强制中断发生时取消等待中的播放请求,避免异步激活后意外续播。
  • 通话等系统强制中断和原有耳机断连处理保留;其他平台仍使用原 audio_session 路径。无需修改或重编译 mpv。
  • 新增 9 项 Dart 回归测试,覆盖异步初始化、默认策略、启用/禁用、停用、原生错误、中断/空闲超时和设置持久化。

原 audio_session 鸿蒙实现的 setActive(false) 未实际停用会话,激活会重复注册监听且未处理 Promise 拒绝,因此只替换鸿蒙端的激活与中断通道。

验证

使用项目配套 Flutter OHOS 3.44.9 / Dart 3.12.2,按现有构建流程规范化包名后验证:

  • 修改文件 Dart 分析:无问题。
  • 全部 11 项 Flutter 单元测试通过(本次新增 9 项 + 已有 2 项)。
  • ARM64 Release HAP 构建成功,包含 ArkTS 与原生插件编译;包内已核验新插件与设置代码。
  • 交付测试包后的实测反馈:该功能正常。

建议补充回归:分别检查视频/直播、小艺及其他语音输入、扬声器/有线/蓝牙耳机、开关关闭后的策略、双击暂停/恢复、通话强制中断和耳机断连。

范围与限制

  • 混音不能绕过系统强制中断或蓝牙 SCO/硬件路由限制,不承诺所有录音场景绝不中断。
  • 本次只覆盖视频/直播的公共播放器,不改变独立音频页实现。
  • 不修改 SDK、引擎版本要求、依赖锁文件或构建环境配置;不包含 Nix/Flake、文档、额外工具脚本或 .gitignore 改动。

参考:OpenHarmony 音频会话管理,所用策略接口从 API 12 提供。

新增默认关闭且持久化的鸿蒙混音开关,覆盖视频和直播。播放前等待原生 AudioSession 策略生效,串行管理激活、停用和清理,并保留系统强制中断及耳机断连处理。

加入 9 项 Dart 回归测试,覆盖初始化等待、策略切换、停用、错误、中断和持久化。
@HelloZeroNick

Copy link
Copy Markdown
Member

刚刚读了一下你的代码,我认为audio_session包已经为音频焦点设置提供了良好的实现,你的channel实现有些不必要。
此外,由于audio_session的封装,这个功能完全可以跨平台实现,应该前往上游 提pr或issues,而不是在这里。
如果你特别希望在鸿蒙体验这个功能,可以使用鸿蒙适配的PiliNara或PiliPlusX
感谢你为鸿蒙生态做出的贡献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants