用户在应用中正在播放一段音频作为背景音乐,当用户点击应用中某个功能时。应用会拉起麦克风监听环境音,导致打断了当前正在播放的音频。
根据Hilog日志来排查问题:
- 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在更新音频播放的元数据,如播放状态,进度位置,播放倍速,缓存的时间、播放时长等信息。
- 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。对应于,用户点击功能后,应用拉起了麦克风功能。
- 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做出必要的响应。
参考监听音频焦点事件处理音频焦点变化。