uni.getBackgroundAudioManager()需手动监听onEnded事件实现切歌,因不支持自动循环;换歌时须pause、重设src及元数据(title/singer/coverImgUrl),且coverImgUrl需HTTPS、≥300×300像素以确保Android通知栏“下一曲”按钮生效。

uni.getBackgroundAudioManager() 必须手动监听 onEnded 才能切歌
微信小程序的 uni.getBackgroundAudioManager() 不支持 loop = true 自动循环,更不会自动切到下一首。它只在当前音频结束时触发 onEnded 事件,其余一切(如 seek、换源、播放新地址)都得你手动写逻辑。
常见错误现象:设了 manager.src 后没监听 onEnded,用户锁屏后播完一首就停,以为“卡了”或“API 失效”。其实只是没写后续动作。
- 必须在
onEnded回调里显式调用manager.src = nextUrl+manager.play() - 换歌前建议先
manager.pause(),避免旧音频残留缓冲干扰 - nextUrl 必须仍是 HTTPS 地址,且需重新填
title/singer/coverImgUrl,否则 iOS 锁屏界面信息不更新 - 加
try/catch包裹play(),部分安卓机型在后台切换时会报错play failed: Not allowed to load local resource
锁屏状态下无法主动触发切歌,只能靠 onEnded 或用户操作
微信平台明确限制:锁屏/后台状态下,JS 线程被挂起,所有非事件驱动的操作都会失效。你不能在 onHide 里定时器轮询、不能在 onUnload 里预加载下一首、也不能靠 setTimeout 模拟自动切歌——这些代码根本不会执行。
唯一可靠路径只有两条:
- 靠
manager.onEnded触发,这是系统允许的后台事件 - 等用户手动点锁屏界面控件(上一曲/下一曲),微信会通过
manager.onPrevPlay/manager.onNextPlay通知你,再由你响应换源+play
别试图在 onHide 里调用 manager.seek() 或 manager.play() —— 它们静默失败,无报错,也无日志,极难排查。
Android 微信通知栏“下一曲”按钮无效?检查 coverImgUrl 和尺寸
Android 微信通知栏显示“下一曲”按钮的前提是:封面图 coverImgUrl 必须是 HTTPS 地址,且分辨率 ≥ 300×300 像素。低于这个尺寸,按钮直接不渲染,用户只能看到播放/暂停控件。
常见错误现象:iOS 锁屏能切歌,Android 微信通知栏却只有播放/暂停,点“下一曲”无反应。不是 API 问题,是封面图不达标。
- 用
https://via.placeholder.com/300这类占位图测试是否生效 - 不要用本地路径如
/static/cover.jpg,App 端和小程序端都不认 file 协议 - 如果封面图是 CDN 缓存的,确保 HTTP Header 允许跨域(
Access-Control-Allow-Origin: *),否则 Android 可能加载失败导致控件降级
多首歌连续播放时,iOS 锁屏封面不更新?元数据必须重置
iOS 锁屏界面不会自动刷新封面和标题。哪怕你换了 manager.src,只要没重新赋值 manager.title、manager.singer、manager.coverImgUrl,锁屏界面上仍显示第一首的信息。
这不是缓存问题,是 iOS 系统强制要求:每次换歌,这三项元数据必须全部重写,缺一不可。
- 即使新歌没有封面,也要给
coverImgUrl赋一个有效 HTTPS 占位图,否则锁屏控件直接消失 -
epname不是必填,但填了能让锁屏显示更完整,建议统一设置 - 不要复用同一个
manager实例却不重置元数据——这是 iOS 真机最常被忽略的细节
后台播放这件事,核心不在“怎么播”,而在“怎么让系统相信你在正经播音乐”。从 src 协议、元数据完整性,到事件响应时机,漏掉任意一环,iOS 就静音,Android 就不显示控件。真机调试时,别只看页面内效果,一定要锁屏、切微信、进通知栏,三步全走一遍。


















