目录

应用拉起麦克风导致播放中的音频中断

问题现象

用户在应用中正在播放一段音频作为背景音乐,当用户点击应用中某个功能时。应用会拉起麦克风监听环境音,导致打断了当前正在播放的音频。

背景知识

问题定位

根据Hilog日志来排查问题:

  1. 在日志中检索关键字"AVSession",或者可以直接通过AVSession关键字来进行过滤。如下日志信息:
    07-03 09:36:31.157   3163-8927     C02B91/com.hua...ice/AVSession  com.huawe...aservice  I     [HandleEventWithThreadSafe]event:1|num:1|state:2
    07-03 09:36:31.157   3231-3231     A01C04/com.ohos.sceneboard/MC   com.ohos.sceneboard   I     CardMediaController_debug --> playstate change showing avsession callback : {"state":2,"speed":1,"position":{"elapsedTime":2439,"updateTime":1751506591156},"isFavorite":false,"duration":184064}, locale

    根据以上信息可以看到,AVSession在更新音频播放的元数据,如播放状态,进度位置,播放倍速,缓存的时间、播放时长等信息。

  2. 继续在之后的日志中进行检索关键字“destroy”,如下日志信息:
    07-03 09:36:31.308   33144-33144   C02B8A/anco_au...ncoAudioProxy  anco_audio            I     [AncoAvSessionDestroy]AncoAvSessionDestroy
    07-03 09:36:31.308   33144-33144   C02B8A/anco_au...ncoAudioProxy  anco_audio            I     [Destroy]AvSession destroy
    07-03 09:36:31.308   33144-33144   C02B91/anco_audio/AVSession     anco_audio            I     [Destroy]enter
    07-03 09:36:31.309   1698-58913    C02B91/av_session/AVSession     av_session            I     [Destroy]AVSessionItem check service destroy event with service, check serviceCallback exist
    07-03 09:36:31.309   1698-58913    C02B91/av_session/AVSession     av_session            I     [Destroy]AVSessionItem send service destroy event to service
    07-03 09:36:31.309   1698-58913    C02B91/av_session/AVSession     av_session            I     [operator()]Start handle session release event
    0

    根据上述日志信息,可以看到此时触发了AVSession的destroy。对应于,用户点击功能后,应用拉起了麦克风功能。

  3. 继续往下检查日志,如下日志信息:
    07-03 09:36:31.316   1698-18949    C02B91/av_session/AVSession     av_session            I     [~AVSessionItem]destroy with activate session, try deactivate it
    07-03 09:36:31.316   1698-18949    C02B91/av_session/AVSession     av_session            I     [Deactivate]Deactivate in
    07-03 09:36:31.316   1698-58913    C02B91/av_session/AVSession     av_session            I     [GetAllSessionDescriptors]GetAllSessionDescriptors with size=1, topSession:io.moreless.tide.next
    07-03 09:36:31.316   1698-18949    C02B91/av_session/AVSession     av_session            I     [Deactivate]Deactivate done

    可以看到这里进行音频播放的AVSession被终止,音频播放停止。

分析结论

由于拉起了麦克风功能,音频焦点变化未做相应处理,系统默认停止了当前的AVSession,导致播放的音频停止。

修改建议

根据音频焦点管理解决方案,不同应用间音频流焦点相互抢占情况,例如后播短视频会打断先播的后台音乐,按照系统默认焦点策略,后台音乐会停止播放,且短视频暂停或者播放结束后也不会恢复播放。

建议应用监听音频焦点事件,并在焦点发生变化时,根据InterruptEvent做出必要的响应。

参考监听音频焦点事件处理音频焦点变化。