HarmonyOS 鸿蒙Next中AVCastPicker组件会莫名自动切换
HarmonyOS 鸿蒙Next中AVCastPicker组件会莫名自动切换 1、正常情况:在未启动音频输出时,使用AVCastPicker组件切换到听筒,在启动音频输出后,再关闭音频输出,使用AVCastPicker组件切换到扬声器,再启动音频输出,这时AVCastPicker组件还是扬声器。
2、异常情况:在未启动音频输出时,使用AVCastPicker组件切换到听筒,在启动音频输出后,使用AVCastPicker组件切换到扬声器,再关闭音频输出,再启动音频输出,这时AVCastPicker组件会莫名自动切回听筒。这是正常情况吗?可以让它不自动切回听筒吗?
我专门写了一个测试的demo:https://gitee.com/chen_yi_ze/TestAVCastPicker/tree/master/
更多关于HarmonyOS 鸿蒙Next中AVCastPicker组件会莫名自动切换的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,通过日志排查: C02B87/audio_s…oStateManager audio_server I [SetPreferredCallRenderDevice]deviceType: -1, callerUid: 0, callerPid: 751, ownerUid:20020323, bundle name: , caller: SetAudioScenePre
可知当上一条通话流彻底关闭后,会触发将音频输出设备还给默认设备。待下次起流时生效。开发者在关闭了音频输出后在下次开启前通过AVCastPicker切换输出设备,本质上是对下一条音频流做的切换,故可以成功,而开发者原问题中的先使用AVCastPicker切换输出设备,再停流再重新起流,切换设备只作用于了上一条已关闭的音频流,未作用到新起的音频流,所以输出设备为默认设备,若是开发者希望继续使用上一条流的最终音频输出结果,可以保存上次最终的音频输出结果并下次起流后使用setdefaultoutputdevice进行切换。
更多关于HarmonyOS 鸿蒙Next中AVCastPicker组件会莫名自动切换的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,本地使用6.0.0.108 API 20版本的设备和6.0.2 Release的DevEco Studio运行您的demo,先使用AVCastPicker切换音频输出为听筒,再打开 音频输出:通话用途 并将音频输出切换到扬声器 未出现开发者描述的AVCastPicker组件自动切回听筒的现象。为了进一步分析问题,方便的话可以麻烦开发者提供下您这边使用的设备及DevEco Studio版本已经运行的日志信息吗?
日志获取:
- hdc shell
- cd data/log/hilog
- hilog -w clear (清除多余日志)
- 复现问题
- exit后执行hdc file recv /data/log/hilog D:\log
这是操作视频。
开发者你好,因开发者的demo中使用的audiorender进行通话场景下的播放,而在语音通话场景下默认采用的听筒输出音频,所以出现了开发者的问题,开发者若是需要设置默认的音频输出设备,可以使用audiorender的setdefaultoutputdevice接口进行音频输出设备切换:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiorenderer#setdefaultoutputdevice12
在未启动音频输出时,使用AVCastPicker组件切换到听筒,在启动音频输出后,再关闭音频输出,使用AVCastPicker组件切换到扬声器,再启动音频输出,这时AVCastPicker组件还是扬声器。
那这个情况下你怎么解释呢?
AVCastPicker组件自动切换问题通常由设备发现机制触发。在鸿蒙Next中,该组件会持续扫描并监听网络中的可用投屏设备。当检测到新的设备加入网络或现有设备状态变化时,组件可能自动更新列表并切换焦点。这属于系统级媒体会话管理的预期行为,旨在保持与当前最优可用设备的连接。可通过检查网络稳定性或排查同一网络内其他设备的广播干扰来确认。
根据你的描述,这属于AVCastPicker组件在特定操作序列下的一个已知行为。其核心逻辑是:当音频输出会话(AudioOutputSession)被释放(即关闭音频输出)时,系统会重置音频路由策略。如果你在会话释放前将输出设备切换为扬声器,但会话释放后系统记录的“上一次用户选择”可能仍停留在听筒(因为该选择是在有会话时做出的,但系统可能在会话生命周期外以不同方式记录或恢复默认)。
这不是一个Bug,而是当前的设计机制。组件在音频会话重新建立时,会尝试恢复到系统认为的“合适”或“上一次”的设备,而这个判断逻辑可能与你的操作时序产生预期偏差。
要让其不自动切回听筒,关键在于在正确的时机设置音频输出设备,并确保设置生效于即将启动的音频会话上。 建议的解决思路如下:
-
在启动音频输出前明确设置设备:在每次调用
startAudioOutput()启动音频输出之前,先通过avSession.setAudioOutputDevice()或相关API,将目标输出设备(如扬声器)明确设置到当前的AVSession上。这能确保新会话以你指定的设备开始,覆盖系统的自动恢复逻辑。 -
监听会话状态并主动控制:监听音频输出会话的启动与释放事件。在会话释放后、下一次启动前,通过程序主动将AVCastPicker的选中项或AVSession的输出设备设置为扬声器,然后再启动音频输出。
在你的Demo中,可以尝试修改逻辑:在“关闭音频输出”后,如果希望下次启动时使用扬声器,就立即将AVSession的音频输出设备设置为扬声器(即使当前没有活跃的音频输出会话)。这样当再次startAudioOutput()时,新会话会继承这个设置。
由于HarmonyOS Next的API可能调整,请查阅最新的AVSession开发指南中关于音频设备控制的部分,确认setAudioOutputDevice等方法的具体使用方式和时机。

