Creator版本:v2.4.9
目标平台:微信小游戏
音频播放API: cc.audioEngine
问题:
游戏中,手机来电后,无论接听还是拒绝,回到游戏背景音乐不自动恢复;
修复:
通过自定义引擎调试发现,在游戏进行中,手机接到电话时cc.audioEngine._break函数会被调用两次;
下面是v2.4.9源码CCAudioEngine.js文件的部分截图:
下面是修复后的代码截图:
_break函数和_restore设计上应该一对一调用的 ; 至于为什么_break会被调用两次,这里没有去研究,有兴趣的可以研究并回复告诉^_^;
从Github的源码看,从我们当前用的2.4.9到2.4.12都是一样的代码;v2.4.10~v2.4.12是否解决_break函数来电时被调用两次没有去验证,待各位自行验证;
若不想使用定制引擎,项目中可以通过在合适的地方覆盖cc.audioEngine._break方法达到修复的目的:
cc.audioEngine._break = function () {
cc.audioEngine._breakCache = cc.audioEngine._breakCache || [];
for (let id in cc.audioEngine._id2audio) {
let audio = cc.audioEngine._id2audio[id];
let state = cc.audioEngine.AudioState.getState();
if (state === cc.audioEngine.AudioState.PLAYING) {
cc.audioEngine._breakCache.push(id);
audio.pause();
}
}
}
上面为TS版本
补充:先前调试时,一直盯着Creator源码在看,忽略了adapter的源码,所以没调试出_restore函数会被调用两次的原因;
今天看到这个https://github.com/cocos/cocos-engine/pull/4757Pull request后,查看了一下v2.4.9发行版引擎自带的adapter代码:
Creator源码:
上面的源码已经很清楚了,这里就不再做补充说明;




