Android音频焦点:为何onAudioFocusChange未处理临时类焦点获取事件?
为什么多数
onAudioFocusChange实现不处理Focus_Gain_transient和Focus_Gain_transient_may_duck 这俩状态存在感低,核心原因和它们的定位、回调触发逻辑直接相关:
回调接收方的特殊性:这两个状态是发给刚获取临时音频焦点的APP的,而非当前正在播放的APP。比如你在听音乐,导航APP请求临时焦点播放提示音,导航APP会收到
Focus_Gain_transient回调,而你的音乐APP收到的是Focus_Loss_transient。多数开发者做的是持久播放类APP,根本不会收到这俩回调,自然不会写对应的处理逻辑。场景覆盖范围窄:需要处理这俩状态的,都是那些需要临时占用焦点的APP——比如语音助手、消息提示工具、导航播报。这类APP的数量远少于音乐、视频这类持久播放APP,所以公开的实现案例里很少见到相关代码。
处理逻辑可复用:这俩状态的处理逻辑和
Focus_Gain高度重叠,唯一区别是播放结束后必须主动调用abandonAudioFocus()释放焦点。很多开发者会直接复用Focus_Gain的启动播放逻辑,再加上释放步骤,不会单独写分支,看起来像是没处理,但实际已经兼容了。
如果你的APP属于临时焦点需求类,处理逻辑其实很直接:
- 收到
Focus_Gain_transient:启动短时音频播放,播放完成后立刻释放焦点。 - 收到
Focus_Gain_transient_may_duck:启动播放即可,系统会自动让其他正在播放的APP降低音量(duck),播放结束后释放焦点。
内容的提问来源于stack exchange,提问作者Anass Ribag
相关产品推荐
相关产品推荐

