uni-app uni.getBackgroundAudioManager()在切换音乐时监听事件累加多次触发问题
uni-app uni.getBackgroundAudioManager()在切换音乐时监听事件累加多次触发问题
| 信息类别 | 信息内容 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC系统版本 | win11 |
| HBuilderX | Alpha |
| HBuilderX版本 | 3.3.0 |
| 手机系统 | Android |
| 手机系统版本 | Android 11 |
| 手机厂商 | 华为 |
| 手机机型 | 荣耀note10 |
| 页面类型 | vue |
| vue版本 | vue2 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
操作步骤:
let bgm = uni.getBackgroundAudioManager();
bgm.onPlay(()=>{})
预期结果:
每次切换监听事件只触发一次
实际结果:
每次切换监听会累加,如果切换10次,事件会累加10次
bug描述:
使用uni.getBackgroundAudioManager()开发背景音乐播放器,但是在切换音乐的时候,onPlay,onPause等监听事件一直累加多次触发,如初始化播放onPlay触发一次;点下一首,onPlay触发两次;点上一首,onPlay触发三次;再切换还会一直累加

更多关于uni-app uni.getBackgroundAudioManager()在切换音乐时监听事件累加多次触发问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
没有这种情况
<template>
<view class="content">
<button @click=“stop()”>zanting</button>
<button @click="open()">打开</button>
</view>
</template>
<script>
const bgAudioManager = uni.getBackgroundAudioManager();
export default {
data() {
return {
title: 'Hello'
}
},
onLoad() {
bgAudioManager.title = '致爱丽丝';
bgAudioManager.singer = '暂无';
bgAudioManager.coverImgUrl = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/7fbf26a0-4f4a-11eb-b680-7980c8a877b8.png';
bgAudioManager.src = 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3';
bgAudioManager.onPlay(()=>{
console.log("onPlay")
})
bgAudioManager.onStop(()=>{
console.log("onStop")
})
bgAudioManager.onCanplay(()=>{
console.log("onCanplay")
})
},
methods: {
open: function() {
bgAudioManager.play();
},
stop: function() {
bgAudioManager.stop();
}
}
}
</script>
<style>
</style>
更多关于uni-app uni.getBackgroundAudioManager()在切换音乐时监听事件累加多次触发问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
请问这个问题解决了吗?遇到了同样的问题
这是 uni-app 中 uni.getBackgroundAudioManager() 事件监听器的常见问题。原因是每次调用 onPlay() 等方法时,都会添加一个新的监听器,而旧的监听器并未移除,导致事件被重复触发。
解决方案:
在每次重新绑定事件前,先移除之前的事件监听。可以使用 offPlay()、offPause() 等方法:
let bgm = uni.getBackgroundAudioManager();
// 移除旧的事件监听
bgm.offPlay();
bgm.offPause();
bgm.offStop();
// ... 其他需要的事件
// 绑定新的事件监听
bgm.onPlay(() => {
console.log('播放');
});
bgm.onPause(() => {
console.log('暂停');
});
// ... 其他事件
更优的实践:
建议将背景音频管理器的初始化封装为一个函数,在每次需要更新监听时调用:
function setupBackgroundAudioListeners() {
const bgm = uni.getBackgroundAudioManager();
// 移除所有旧监听
bgm.offPlay();
bgm.offPause();
bgm.offEnded();
bgm.offError();
// 设置新监听
bgm.onPlay(() => {
console.log('音乐开始播放');
});
bgm.onPause(() => {
console.log('音乐暂停');
});
bgm.onEnded(() => {
console.log('音乐播放结束');
// 自动播放下一首逻辑
});
bgm.onError((res) => {
console.error('播放错误:', res);
});
}
// 在切换音乐时调用
function switchMusic(newSrc) {
const bgm = uni.getBackgroundAudioManager();
bgm.stop(); // 停止当前播放
setupBackgroundAudioListeners(); // 重新设置监听器
bgm.src = newSrc;
bgm.title = '新歌曲';
bgm.play();
}

