鸿蒙背景音乐 uni-app this.audioCtx.onEnded(() 无再次play

鸿蒙背景音乐 uni-app this.audioCtx.onEnded(() 无再次play

开发环境 版本号 项目创建方式
Windows 64 HBuilderX

操作步骤:

this.audioCtx.onEnded(() => {  
    setTimeout(() => {  

        this.audioCtx.title = '致爱丽丝';  
        this.audioCtx.singer = '暂无';  
        this.audioCtx.coverImgUrl = 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/music-a.png';  
        this.audioCtx.src = 'https://web-ext-storage.dcloud.net.cn/doc/uniapp/ForElise.mp3';  
        this.audioCtx.play();  
    }, 300)  
})

预期结果:

预期结果是播放这个音乐

实际结果:

title singer coverImgUrl src都是更换成功的,但就是play();无法触发,没有任何反应,onplay() onError()都不会触发,连在实况窗点播放也是没有反应的

bug描述:

鸿蒙背景音乐 this.audioCtx.onEnded() this.audioCtx.play() 不能触发 onPlay, 其他的修改都行可以的,就是不能播放,在实况窗点播放也没有任何反应,不知道是鸿蒙底层的问题


更多关于鸿蒙背景音乐 uni-app this.audioCtx.onEnded(() 无再次play的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

反馈完整性

标题、描述、代码片段、复现步骤、预期/实际结果、环境信息都已给出,基本完整。
代码片段可直接粘到页面 onLoad 里运行,无需额外改动。
但缺少 manifest 中后台播放权限配置截图,以及真机运行日志(adb log / IDE log),后续定位仍需补充。

Bug 是否成立 根据知识库:

HarmonyOS Next 从 HBuilderX 4.31 起支持 getBackgroundAudioManager,4.87 版本满足最低要求。
文档明确提示「鸿蒙元服务需要开启后台播放权限」,若未在 manifest.json → module → reqPermissions 里声明 ohos.permission.KEEP_BACKGROUND_RUNNING,系统会拦截第二次播放。
因此该现象属于「权限缺失」而非框架 bug,但用户并不知情,故不算误报,而是信息缺失导致的「问题成立」。

基本概念检查

用户使用的是 getBackgroundAudioManager(全局单例),符合鸿蒙后台播放场景;如仅前台播放,可用 createInnerAudioContext。
代码里在 onEnded 回调里重新设置 src 并调用 play(),文档注明「设置新的 src 时会自动播放」,手动再调一次 play() 理论上无害,但不应是主因。

下一步建议

在 manifest.json 的鸿蒙节点下增加
“reqPermissions”: [
“ohos.permission.KEEP_BACKGROUND_RUNNING”
]
重新打包真机运行。
如仍无效,请补充:

IDE 控制台完整日志(过滤 “BackgroundAudioManager”)。
手机「设置-应用-权限」后台运行权限是否被手动关闭。

临时替代方案:改用 createInnerAudioContext 并在页面隐藏时继续播放(仅前台场景)。
若确认权限已开仍复现,请再提单并附日志,我们将转 HarmonyOS 原生层继续跟进。

【状态】待用户补充权限配置与日志后进一步处理。

更多关于鸿蒙背景音乐 uni-app this.audioCtx.onEnded(() 无再次play的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


关联此问题 https://issues.dcloud.net.cn/pages/issues/detail?id=24202

可以优化。你应当先停止在播放
this.audioCtx.onEnded(() => {
console.log(’ 播放结束’);
setTimeout(() => {

                // this.audioCtx.title = '致爱丽丝';  
                // this.audioCtx.singer = '暂无';  
                this.audioCtx.stop()  
                // this.audioCtx.coverImgUrl = 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/music-a.png';  
                this.audioCtx.src = '/static/009_156.1-183.8.mp3';  
                this.audioCtx.play();  
            }, 300)  
        })<br>

已解决,需要先pause(),才能再次play()

this.audioCtx.onEnded(() => {

this.audioCtx.pause();

setTimeout(() => {

console.log(“结束,停止播放”)

// this.audioCtx.stop()

this.audioCtx.src = “/static/data/bf7e12e5-ed48-4e62-8711-dd649f1b7a3a.mp3”

this.audioCtx.onCanplay(() => {

console.log(“加载,开始播放”)

this.audioCtx.play()

this.audioCtx.onCanplay(() => {})

})

}, 300);

});

根据你的描述,这个问题很可能与鸿蒙系统下音频播放器的生命周期管理有关。在 onEnded 回调中直接调用 play() 可能无法正确触发播放,因为音频上下文在播放结束后可能处于非活动状态。

可以尝试以下解决方案:

  1. 延迟播放并重置音频上下文: 在 setTimeout 中先停止音频上下文,再重新设置属性并播放。

    this.audioCtx.onEnded(() => {
        setTimeout(() => {
            this.audioCtx.stop(); // 确保音频上下文停止
            this.audioCtx.title = '致爱丽丝';
            this.audioCtx.singer = '暂无';
            this.audioCtx.coverImgUrl = 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/music-a.png';
            this.audioCtx.src = 'https://web-ext-storage.dcloud.net.cn/doc/uniapp/ForElise.mp3';
            this.audioCtx.play();
        }, 300);
    });
    
  2. 使用 seek 重置播放位置: 在播放前将播放位置设置为 0,确保音频从开头开始。

    this.audioCtx.onEnded(() => {
        setTimeout(() => {
            this.audioCtx.title = '致爱丽丝';
            this.audioCtx.singer = '暂无';
            this.audioCtx.coverImgUrl = 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/music-a.png';
            this.audioCtx.src = 'https://web-ext-storage.dcloud.net.cn/doc/uniapp/ForElise.mp3';
            this.audioCtx.seek(0); // 重置播放位置
            this.audioCtx.play();
        }, 300);
    });
    
  3. 重新创建音频上下文: 如果上述方法无效,可以尝试销毁并重新创建音频上下文。

    this.audioCtx.onEnded(() => {
        setTimeout(() => {
            this.audioCtx.destroy(); // 销毁当前上下文
            this.audioCtx = uni.createInnerAudioContext(); // 重新创建
            this.audioCtx.title = '致爱丽丝';
            this.audioCtx.singer = '暂无';
            this.audioCtx.coverImgUrl = 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/music-a.png';
            this.audioCtx.src = 'https://web-ext-storage.dcloud.net.cn/doc/uniapp/ForElise.mp3';
            this.audioCtx.play();
        }, 300);
    });
回到顶部