分享:微信小程序cc.audioEngine播放背景音乐,手机来电导致声音不恢复的问题修复

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源码:

上面的源码已经很清楚了,这里就不再做补充说明;

2赞

这样的帖子应该收集起来,给我们广大的2.x钉子户查阅

1赞

做2D游戏,可能还不少项目在用2.x版本,甚至包括新立项目 :joy: