更新记录
1.2.53(2026-10-08)
- 修复 iOS 在未初始化、无可播放曲目等失败分支中,将强类型
fail回调转换为通用函数时可能闪退的问题;保留原success / fail / complete参数和调用方式。 - 补齐 iOS 播放时补载曲目、设置歌单及按索引切歌的装载失败回调,确保依次触发
fail / complete,兼容只传complete,成功时不会重复完成回调。 - 本次包含 iOS 原生代码更新,升级后必须重新制作并安装 iOS 自定义基座或正式 IPA;仅更新页面资源或 WGT 不会更新原生修复。Android 原生实现未变更,本次升级无需重打 Android 自定义基座。
1.2.52(2026-10-04)
- 新增
subscribe/unsubscribe独立事件订阅,多个页面或组件可分别持有 token 并只取消自己的回调,不影响旧on/off用法。 - 新增 uni-app 与 uni-app x 独立订阅示例;完整播放示例增加一键复制事件日志,便于定位播放和订阅状态。
- 修复 Android Vapor 页面切换或子页面销毁时误清理模块事件桥,导致父页面及后续页面收不到
progress/stateChange等回调的问题。 - Android 原生实现已在匹配的新自定义基座完成播放、后台媒体控制、独立订阅、10 次页面往返和冷启动验收;升级后需重新制作并安装 Android 自定义基座或正式包。
- iOS 新订阅实现已完成打包,本版本发布前未进行 iOS 真机验收。
1.2.51(2026-09-21)
- 修复 Android 初始化、播放控制、状态与能力查询、跳转、倍速、音量、循环、曲目追加和移除等 API 已执行但
success / fail / complete不回调的问题。 - 修复完整示例把初始化参数中的
fail回调字段误显示为红色错误的问题;只有真实失败、异常或错误日志才固定显示在首屏。 - 修复完整示例第三首测试曲目的曲名与歌手字段写反,媒体通知现在按“月光下的传说 / 李钊”展示。
- 修复 Web 切换曲目时成功和完成回调重复触发,以及移除曲目后播放列表位置与实际音源不一致的问题。
- 修复 Web 播放被浏览器拒绝时仍返回成功的问题,现在通过失败回调和错误事件说明原因。
- 修复简单示例重复初始化时叠加进度监听、退出页面后仍保留监听的问题。
- 按功能模块重整使用说明,补齐各项能力的接入示例和平台差异;示例页面采用紧凑布局,状态与日志可展开查看。
- 升级后无需修改现有调用代码;Android 原生 UTS 生成物已变化,必须重新制作并安装匹配的 Android 自定义基座或正式包。iOS 无需因本次 Android 修复重新制作基座。
平台兼容性
uni-app(4.84)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.84)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
lizhao-bg-audio
介绍
lizhao-bg-audio 为 uni-app / uni-app x 提供背景音频播放能力,用同一套 API 管理单曲、歌单、播放进度和系统媒体控制,适合音乐、有声书与课程音频。
功能特色
| 特色功能 | 能解决什么问题 |
|---|---|
| 单曲与歌单播放 | 从播放一段音频扩展到章节列表、上一首、下一首和指定章节 |
| 后台播放与系统媒体卡 | 在支持的平台继续播放,并显示标题、作者、封面和播放控制 |
| 进度、倍速与循环 | 实现断点续听、拖动进度、课程倍速和循环播放 |
| 动态补充下一曲 | 提前通知业务获取下一集,并提供等待、超时和续播事件 |
| 状态与事件 | 查询当前曲目和队列,更新页面上的进度、状态与错误提示 |
| 能力查询 | 按实际运行环境决定是否显示倍速、音量和媒体控制功能 |
各平台的后台、音量、倍速和动态下一曲能力有差异,详细范围见后文“支持平台”。
适合哪些场景
| 场景 | 推荐用法 |
|---|---|
| 播放一段音乐或讲解 | 初始化后使用 setTrack 和 play |
| 课程、有声书、音乐歌单 | 使用 setPlaylist 管理队列,再按章节切换 |
| 从上次位置继续收听 | 保存 progress 的位置,下次使用 play({ startPosition }) |
| 下一集地址需要临时获取 | 在支持的平台监听 preloadNext,拿到地址后使用 appendTrack |
| 自定义迷你播放器 | 用 stateChange、progress 和状态查询更新自己的页面 |
下载与导入
- 从插件市场选择“使用 HBuilderX 导入插件”,导入自己的 uni-app 或 uni-app x 项目。
- 保留完整的
uni_modules/lizhao-bg-audio目录;页面只从@/uni_modules/lizhao-bg-audio导入。 - 先运行下面的最小示例,再按业务需要增加歌单、进度或系统控制。
插件提供了可复制的完整页面:
| 项目 | 示例 |
|---|---|
| uni-app,简单播放 | 客户简单示例.vue |
| uni-app,完整功能 | backgroundAudio.vue |
| uni-app x | index.uvue |
复制示例到自己的页面目录后,在 pages.json 注册对应页面。插件提供播放 API,播放器外观可以按业务自行编写。
5 分钟跑通:播放一首音频
调用顺序是:先监听事件 → 初始化成功 → 设置曲目成功 → 开始播放。下面使用公开演示音频,接入时换成自己的可访问地址。不要在 <script> 顶层直接执行 initPlayer(),应从按钮、页面生命周期或应用音频管理方法调用。
uni-app:放进一个已注册的 .vue 页面
<template>
<view>
<button @click="initAndPlay">初始化并播放</button>
<button @click="stopPlayback">停止播放</button>
</view>
</template>
<script>
import * as BgAudio from '@/uni_modules/lizhao-bg-audio'
// 保存监听函数,退出页面时使用同一个引用取消订阅。
const = (event) => console.log('音频播放结束', event.payload)
const onError = (event) => console.log('音频运行错误', event.payload)
export default {
onLoad() {
// 先监听,避免错过起播后的事件。
BgAudio.on('ended', )
BgAudio.on('error', onError)
},
onUnload() {
// 页面离开只解除页面监听,背景音频可以继续播放。
BgAudio.off('ended', )
BgAudio.off('error', onError)
},
methods: {
initAndPlay() {
BgAudio.initPlayer({
success: () => {
BgAudio.setTrack({
track: {
id: 'demo-1',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
title: '演示音频',
singer: 'SoundHelix'
},
success: () => {
// 设置曲目后显式播放;0 表示从头开始。
BgAudio.play({
startPosition: 0,
fail: (err) => console.log('播放失败', err.errCode, err.errMsg)
})
},
fail: (err) => console.log('设置曲目失败', err.errCode, err.errMsg)
})
},
fail: (err) => console.log('初始化失败', err.errCode, err.errMsg)
})
},
stopPlayback() {
// 由使用者主动结束播放。
BgAudio.stop({
fail: (err) => console.log('停止失败', err.errCode, err.errMsg)
})
}
}
}
</script>
uni-app x:放进一个已注册的 .uvue 页面
<template>
<view>
<button @click="initAndPlay">初始化并播放</button>
<button @click="stopPlayback">停止播放</button>
</view>
</template>
<script setup lang="uts">
import * as BgAudio from '@/uni_modules/lizhao-bg-audio'
import { type BackgroundAudioEvent, type BackgroundAudioFail } from '@/uni_modules/lizhao-bg-audio'
// UTS 为事件和失败参数声明类型。
const = (event: BackgroundAudioEvent): void => {
console.log('音频播放结束', event.payload)
}
const onError = (event: BackgroundAudioEvent): void => {
console.log('音频运行错误', event.payload)
}
function showFail(err: BackgroundAudioFail): void {
console.log('音频操作失败', err.errCode, err.errMsg)
}
onLoad(() => {
BgAudio.on('ended', )
BgAudio.on('error', onError)
})
onUnload(() => {
// 解除本页面监听,不自动停止全局背景音频。
BgAudio.off('ended', )
BgAudio.off('error', onError)
})
function initAndPlay(): void {
BgAudio.initPlayer({
success: (_res: any) => {
BgAudio.setTrack({
track: {
id: 'demo-1',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
title: '演示音频',
singer: 'SoundHelix'
},
success: (_trackResult: any) => {
// 设置曲目成功后,再发起播放。
BgAudio.play({
startPosition: 0,
fail: (err: BackgroundAudioFail) => showFail(err)
})
},
fail: (err: BackgroundAudioFail) => showFail(err)
})
},
fail: (err: BackgroundAudioFail) => showFail(err)
})
}
function stopPlayback(): void {
// 仅在使用者点击停止时结束播放。
BgAudio.stop({ fail: (err: BackgroundAudioFail) => showFail(err) })
}
</script>
最小示例用于一个播放页面。多个页面共同控制背景音频时,建议在应用级统一管理播放器和事件,页面只负责展示;具体订阅边界见后文“事件与回调”。
从基础到进阶:按业务模块使用
以下片段沿用基础示例的 BgAudio 导入。除初始化与监听外,其余操作均在初始化成功后,从按钮或业务方法中调用;各片段按需选择,不要顺序执行所有控制操作。
模块一:暂停、继续与结束播放
解决什么问题: 区分临时暂停与主动结束。什么时候使用: 播放按钮、暂停按钮、关闭播放器或退出收听业务时。
// 分别绑定到对应按钮,不要一次依次执行。
function pauseAudio() {
BgAudio.pause({ fail: (err) => console.log('暂停失败', err.errMsg) })
}
function resumeAudio() {
BgAudio.resume({ fail: (err) => console.log('继续播放失败', err.errMsg) })
}
function stopAudio() {
BgAudio.stop({ fail: (err) => console.log('停止失败', err.errMsg) })
}
pause 保留播放位置,resume 从当前位置继续,stop 停止并重置进度。需要从指定位置开始时使用 play({ startPosition: 秒数 })。普通页面切换和应用退到后台,不应自动调用 stop。当前没有公开 destroyPlayer 方法。
模块二:加载歌单与切换章节
解决什么问题: 一次传入完整歌单,并从指定章节开始。什么时候使用: 课程目录、专辑或有声书章节列表。
uni-app 在初始化成功后执行:
// 设置完整队列;startIndex 从 0 开始,设置成功后再播放。
BgAudio.setPlaylist({
tracks: [
{
id: 'chapter-1',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
title: '第一章'
},
{
id: 'chapter-2',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3',
title: '第二章'
}
],
startIndex: 0,
success: () => {
BgAudio.play({ fail: (err) => console.log('歌单播放失败', err.errMsg) })
},
fail: (err) => console.log('加载歌单失败', err.errMsg)
})
uni-app x 使用公开的 SetPlaylistBridgeOptions 类型,以下函数放入 <script setup lang="uts">,初始化成功后调用 loadPlaylist():
import { type SetPlaylistBridgeOptions } from '@/uni_modules/lizhao-bg-audio'
function loadPlaylist(): void {
// tracks 使用该公开参数类型要求的数组类型。
const tracks: Array<any> = [
{
id: 'chapter-1',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
title: '第一章'
},
{
id: 'chapter-2',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3',
title: '第二章'
}
]
const options: SetPlaylistBridgeOptions = {
tracks: tracks,
startIndex: 0,
success: (_res: any) => {
BgAudio.play({
fail: (err: BackgroundAudioFail) => console.log('歌单播放失败', err.errMsg)
})
},
fail: (err: BackgroundAudioFail) => console.log('加载歌单失败', err.errMsg)
}
BgAudio.setPlaylist(options)
}
已有队列后,把下面操作分别放到切歌按钮中:
// 上一首、下一首或选中第二项;目标曲目下标从 0 开始。
function previousChapter() {
BgAudio.skipToPrev({ fail: (err) => console.log('上一首失败', err.errMsg) })
}
function nextChapter() {
BgAudio.skipToNext({ fail: (err) => console.log('下一首失败', err.errMsg) })
}
function selectSecondChapter() {
BgAudio.skipToIndex({
index: 1,
fail: (err) => console.log('切换章节失败', err.errMsg)
})
}
目标下标必须在列表范围内。setPlaylist 用于替换完整列表,setTrack 用于设置当前曲目;不要把 setTrack 当作清空旧歌单的方法。
模块三:追加与移除曲目
解决什么问题: 播放中修改待播列表。什么时候使用: “加入播放列表”、删除章节或取得下一集地址后。
// 追加一首待播音频;id 应在业务列表中保持唯一。
function addChapter() {
BgAudio.appendTrack({
track: {
id: 'chapter-3',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-3.mp3',
title: '第三章'
},
success: () => console.log('已加入播放列表'),
fail: (err) => console.log('追加失败', err.errMsg)
})
}
function removeChapter() {
BgAudio.removeTrack({
trackId: 'chapter-3',
success: () => console.log('列表已更新'),
fail: (err) => console.log('移除失败', err.errMsg)
})
}
普通追加用于更新队列;处于 waitingNext 时追加下一曲才会触发等待续播。删除当前播放项后,建议查询播放器和队列状态再刷新页面。
模块四:跳转进度与断点续听
解决什么问题: 拖动进度条或从上次位置开始。什么时候使用: 已加载曲目,需要定位到具体内容时。
// 所有时间单位均为秒;分别用于拖动进度和断点起播。
function seekToThirtySeconds() {
BgAudio.seek({
position: 30,
fail: (err) => console.log('进度跳转失败', err.errMsg)
})
}
function playFromSavedPosition() {
BgAudio.play({
startPosition: 90,
fail: (err) => console.log('断点播放失败', err.errMsg)
})
}
保存位置时同时保存曲目 id,恢复时先加载相同曲目。时长未知或音源不支持定位时,应处理失败并保留从头播放入口。
模块五:倍速、音量与循环
解决什么问题: 按收听习惯调整播放方式。什么时候使用: 音频已经加载后,用户修改播放设置时。
// 各设置分别由对应按钮调用;先查询能力再显示不确定的平台选项。
function useNormalCourseSpeed() {
BgAudio.setPlaybackRate({
playbackRate: 1.5,
fail: (err) => console.log('倍速设置失败', err.errMsg)
})
}
function useComfortableVolume() {
BgAudio.setVolume({
volume: 0.8,
fail: (err) => console.log('音量设置失败', err.errMsg)
})
}
function repeatPlaylist() {
BgAudio.setLoopMode({
loopMode: 'all',
fail: (err) => console.log('循环设置失败', err.errMsg)
})
}
倍速参数为大于 0 的数值,但实际可播范围由平台决定。包含 Harmony 的应用,建议使用 0.5 / 0.75 / 1 / 1.25 / 1.5 / 1.75 / 2 档;传入更大数值不代表能够播放到该倍速。volume 为 0~1,Harmony 当前不支持通过此 API 调整音量。
循环模式为 off(关闭循环)、single(单曲循环)、all(列表循环)。模式名称相同不代表各端循环流程完全一致,iOS、Web 和小程序的范围见“支持平台”。
模块六:用事件更新播放界面
解决什么问题: 让进度条和播放按钮跟随真实状态更新。什么时候使用: 页面展示播放器时;注册一次,退出时解除。
// 在页面 onLoad 中调用 bindPlayerView,在 onUnload 中调用返回的清理函数。
function bindPlayerView() {
const = (event) => console.log('当前播放进度', event.payload)
const onState = (event) => console.log('播放状态变化', event.payload)
const onError = (event) => console.log('播放运行错误', event.payload)
BgAudio.on('progress', )
BgAudio.on('stateChange', onState)
BgAudio.on('error', onError)
return () => {
// 使用注册时的同一函数引用。
BgAudio.off('progress', )
BgAudio.off('stateChange', onState)
BgAudio.off('error', onError)
}
}
不要在每次 play 时重复注册事件。progress 更新较频繁,页面可以节流显示;数据库或网络保存应另设合理间隔。
多个页面分别接收和取消进度
解决什么问题: 播放页、迷你播放器等页面各自接收进度,退出一个页面不会取消其他页面的订阅。什么时候使用: 多个页面或组件共享背景音频,需要分别管理同名事件时。
下面是 uni-app 页面的脚本示例。每个页面保存自己的 token,重复调用不会多次注册,退出时只取消自己持有的订阅。
import { subscribe, unsubscribe } from '@/uni_modules/lizhao-bg-audio'
// 每个页面保存自己的 token,退出时只取消本页订阅。
export default {
data() {
return { progressToken: '' }
},
onLoad() {
this.subscribeProgress()
},
onUnload() {
if (this.progressToken === '') return
try {
unsubscribe(this.progressToken)
this.progressToken = ''
} catch (error) {
console.error('取消进度订阅失败', error)
}
},
methods: {
subscribeProgress() {
if (this.progressToken !== '') return
try {
const token = subscribe('progress', (event) => {
console.log('本页面收到进度', event.payload)
})
if (token === '') {
console.error('注册失败,请检查事件的平台支持及插件是否可用')
return
}
this.progressToken = token
} catch (error) {
console.error('注册进度订阅失败', error)
}
}
}
}
subscribe 可以在播放器初始化前调用,成功后只接收新事件;需要立即恢复界面时,另用 getPlayerState 查询当前状态。unsubscribe(token) 只取消该 token,不停止播放,也不影响其他 token 或旧 on 监听。
可复制的 uni-app 示例 与 uni-app x 示例 在同一页展示 A、B 两个独立订阅者,可分别取消、恢复并比较次数。先在完整播放示例开始播放,再通过 navigateTo 保留播放页并进入订阅页;复制后按前文方式注册页面。uni-app x 回调使用公开的 BackgroundAudioSubscriptionEvent 类型。
模块七:系统媒体卡与音频中断
解决什么问题: 让锁屏、通知栏和耳机控制与应用内状态一致。什么时候使用: App 后台收听与系统控制联动。
基础示例中的 title、singer 会用于媒体信息;需要封面时补充曲目的 cover。播放控制由插件和系统协作处理,页面监听事件以刷新界面。
// 初始化前注册;业务结束时调用返回的清理函数。
function bindSystemAudioEvents() {
const onRemote = (event) => {
// 已处理的系统命令不要再次执行,以免一次点击切换两首。
console.log('收到系统媒体控制', event.payload)
}
const onInterruption = (event) => {
console.log('收到音频中断或恢复通知', event.payload)
BgAudio.getPlayerState({
success: (state) => console.log('中断后的播放状态', state),
fail: (err) => console.log('读取状态失败', err.errMsg)
})
}
BgAudio.on('remoteCommand', onRemote)
BgAudio.on('interruption', onInterruption)
return () => {
BgAudio.off('remoteCommand', onRemote)
BgAudio.off('interruption', onInterruption)
}
}
Android 可在初始化时通过 notificationActions 选择按钮,默认上一首、播放/暂停、下一首;最终外观和可见按钮仍由系统决定。iOS 的 autoRecover 控制系统允许恢复时是否自动续播,不能保证每次中断都会自动恢复。
模块八:动态获取下一集、等待与超时
解决什么问题: 下一集地址需要先请求业务接口,当前曲结束前无法一次拿到整个列表。什么时候使用: Android / Harmony 的动态课程、临时鉴权音频或推荐列表。
“智能下一曲”会提前通知业务补充队列,不会替业务下载或缓存下一曲。先在基础示例的初始化参数中加入:
// 合入业务的初始化流程,成功后仍需设置曲目或歌单并播放。
BgAudio.initPlayer({
preloadNext: true,
preloadNextTime: 20,
nextTrackTimeout: 15000,
success: () => console.log('动态下一曲已开启'),
fail: (err) => console.log('初始化失败', err.errMsg)
})
播放前注册以下监听。此例用固定演示曲目表示“业务已取得下一曲”,实际接入时在自己的接口成功回调中调用 appendTrack,并处理接口失败。
// 在音频业务初始化时调用一次;结束该业务后调用返回的清理函数。
function bindSmartNext() {
let appended = false
const onPreloadNext = (_event) => {
// 本例只补充一首;实际业务按章节 id 去重,并忽略已切换曲目的过期请求。
if (appended) return
appended = true
BgAudio.appendTrack({
track: {
id: 'next-demo',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3',
title: '下一集演示'
},
success: () => console.log('下一集已加入队列'),
fail: (err) => {
appended = false
console.log('追加下一集失败', err.errMsg)
}
})
}
const Next = (event) => console.log('正在等待下一集', event.payload)
const onNextTimeout = (event) => console.log('等待超时,可提示手动重试', event.payload)
BgAudio.on('preloadNext', onPreloadNext)
BgAudio.on('waitingNext', Next)
BgAudio.on('nextTrackTimeout', onNextTimeout)
return () => {
BgAudio.off('preloadNext', onPreloadNext)
BgAudio.off('waitingNext', Next)
BgAudio.off('nextTrackTimeout', onNextTimeout)
}
}
触发条件是:已开启 preloadNext、loopMode='off'、当前曲目处于队列末尾,而且还没有下一曲。提前触发还要求能取得有效时长;同一次曲目播放过程只请求一次。已经加载了完整歌单时,不会为了已有的下一曲重复触发请求。
当前曲结束仍未补齐下一曲时进入 waitingNext;等待期间成功追加会自动续播。nextTrackTimeout=0 表示不自动超时;超时后会通知 nextTrackTimeout,此后补充曲目需要业务明确发起播放。主动停止、切歌或重新设置歌单会结束原来的等待任务。
需要离开页面后继续获取下一集时,应把这组业务监听放在应用级音频管理中。iOS、Web 和小程序目前不承诺上述三个事件及等待自动续播完整可用。
模块九:查询状态、队列与可用能力
解决什么问题: 返回页面时恢复播放器 UI,或按运行环境隐藏不可用操作。什么时候使用: 页面显示、设置功能入口之前、队列修改之后。
// 三种查询按业务需要独立调用,返回数据通过 success 读取。
BgAudio.getPlayerState({
success: (state) => console.log('播放器状态', state),
fail: (err) => console.log('读取播放器状态失败', err.errMsg)
})
BgAudio.getQueueState({
success: (queue) => console.log('播放队列', queue),
fail: (err) => console.log('读取队列失败', err.errMsg)
})
BgAudio.getCapabilities({
success: (caps) => console.log('当前平台能力', caps),
fail: (err) => console.log('读取能力失败', err.errMsg)
})
能力查询用于判断接口是否可用;它不代表某个音源一定可以播放,也不表示系统允许应用无限期后台运行。调用后仍需处理 fail 和 error。
模块十:收集播放问题信息
解决什么问题: 遇到初始化或播放异常时,取得有用的反馈信息。什么时候使用: 用户主动反馈问题或开发联调时。
// 绑定到“查看播放诊断”按钮;先保存记录,需要重现问题时再清空。
function readAudioDiagnostics() {
try {
console.log('播放诊断记录', BgAudio.getDebugTrace())
console.log('异常记录', BgAudio.getCrashReports())
} catch (error) {
console.log('读取诊断失败', error)
}
}
function clearAudioDiagnostics() {
try {
BgAudio.clearDebugTrace()
BgAudio.clearCrashReports()
console.log('诊断记录已清空')
} catch (error) {
console.log('清空诊断失败', error)
}
}
需要控制台日志时,在业务初始化中打开 debug:
// 用于开发联调;合入原有初始化流程,日常使用保持默认关闭。
BgAudio.initPlayer({
debug: true,
success: () => console.log('调试日志已开启'),
fail: (err) => console.log('初始化失败', err.errMsg)
})
Android / iOS 可保留部分初始化诊断;Harmony / Web 提供运行期间的记录;微信小程序返回空数组。异常记录的覆盖范围因平台而异,空数组不能作为“从未发生错误”的依据。
API 用途速查
| 模块 | 适用业务 | 常用方法 | 使用结果 |
|---|---|---|---|
| 初始化 | 开始使用播放器 | initPlayer |
返回初始化状态和能力 |
| 单曲与歌单 | 设置当前内容、替换播放列表 | setTrack、setPlaylist |
更新当前曲目或队列,随后可播放 |
| 播放控制 | 开始、暂停、继续、结束 | play、pause、resume、stop |
改变播放状态 |
| 切换章节 | 上一首、下一首、指定项 | skipToPrev、skipToNext、skipToIndex |
加载并播放目标曲目 |
| 队列维护 | 加入列表、移除曲目 | appendTrack、removeTrack |
更新播放队列 |
| 收听设置 | 进度、倍速、音量、循环 | seek、setPlaybackRate、setVolume、setLoopMode |
调整当前播放设置 |
| 状态恢复 | 返回播放页、显示能力 | getPlayerState、getQueueState、getCapabilities |
通过成功回调取得当前数据 |
| 事件联动 | 进度、结束、错误和系统控制 | on、off |
注册或取消事件订阅 |
| 独立订阅 | 多个页面分别接收、取消同名事件 | subscribe、unsubscribe |
返回独立 token,并按 token 取消 |
| 动态下一曲 | 按需获取下一集 | 初始化 preloadNext + 事件 + appendTrack |
提前请求、等待或超时 |
| 问题反馈 | 读取及清理诊断 | getDebugTrace、getCrashReports、clearDebugTrace、clearCrashReports |
返回字符串数组或清空记录 |
部分平台还保留无参数兼容入口 initPlayerNoOptions();新接入统一使用有失败回调的 initPlayer(options)。
常用参数查询
初始化参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
debug |
boolean | 否 | 开启调试日志 | false |
true / false |
preloadNext |
boolean | 否 | 开启动态下一曲通知,平台范围见模块八 | false |
true / false |
preloadNextTime |
number | 否 | 剩余多少秒时提前通知业务 | 15 |
大于 0 |
nextTrackTimeout |
number | 否 | 播完后等待下一曲的毫秒数;0 为不自动超时 |
0 |
大于等于 0 |
autoRecover |
boolean | 否 | iOS 中断结束且系统允许时尝试恢复 | true |
true / false |
autoRegisterRemoteCommand |
boolean | 否 | iOS 系统媒体控制;当前实现始终注册,不应依赖 false 关闭 |
true |
建议省略 |
notificationActions |
string[] | 否 | Android 通知按钮偏好及顺序,系统可调整显示 | ['prev', 'playPause', 'next'] |
prev / rewind / playPause / forward / next |
曲目信息 BackgroundAudioTrack
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
id |
string | 是 | 非空曲目 ID,用于队列与业务关联 | 无 | 无 |
url |
string | 是 | 可访问音频地址;本地路径支持依平台而定 | 无 | 无 |
title |
string | 是 | 曲目标题 | 无 | 无 |
singer |
string | 否 | 歌手、讲师或作者 | 无 | 无 |
album |
string | 否 | 专辑或课程名称 | 无 | 无 |
cover |
string | 否 | 封面地址,优先使用可访问的 HTTPS 图片 | 无 | 无 |
durationHint |
number | 否 | 时长未知时使用的兜底秒数,不改变音频真实时长 | 无 | 大于等于 0 |
headers |
object | 否 | 请求头扩展;不是所有平台都会用于音频请求 | 无 | 无 |
extras |
object | 否 | 业务附加数据,插件不解释其含义 | 无 | 无 |
播放与队列参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
setTrack.track |
BackgroundAudioTrack | 是 | 当前曲目 | 无 | 见曲目信息表 |
setPlaylist.tracks |
array | 是 | 非空曲目列表;UTS 使用 SetPlaylistBridgeOptions |
无 | 每项为曲目信息 |
setPlaylist.startIndex |
number | 否 | 起始下标,从 0 开始,应在列表范围内 |
0 |
无 |
appendTrack.track |
BackgroundAudioTrack | 是 | 追加的曲目 | 无 | 见曲目信息表 |
removeTrack.trackId |
string | 是 | 要移除的曲目 ID | 无 | 无 |
skipToIndex.index |
number | 是 | 目标下标,须在当前列表范围内 | 无 | 大于等于 0 的整数 |
play.startPosition |
number | 否 | 起播秒数 | 当前进度 | 大于等于 0 |
seek.position |
number | 是 | 目标秒数 | 无 | 大于等于 0 |
setPlaybackRate.playbackRate |
number | 是 | 请求倍速;实际能力依平台 | 无 | 大于 0 |
setVolume.volume |
number | 是 | 播放音量 | 无 | 0~1 |
setLoopMode.loopMode |
string | 是 | 循环方式 | 无 | off / single / all |
已有项目使用 setTrack({ track, tracks, tracksPayloadJson, ... }) 的兼容调用可以保留;新列表使用 setPlaylist。tracksPayloadJson 是可选曲目数据快照,格式为 JSON.stringify({ tracks }),通常不需要手工填写;它不能替代必要的曲目信息。
通用回调
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
success |
function | 否 | 本次操作成功时返回结果 | 无 | 无 |
fail |
function | 否 | 本次操作失败时返回 BackgroundAudioFail |
无 | 无 |
complete |
function | 否 | 本次操作结算后返回成功或失败结果 | 无 | 无 |
业务操作与查询使用这些回调;on/off、subscribe/unsubscribe 和四个诊断方法不使用 options 回调。建议使用 success: (res) => {}、fail: (err) => {} 字段写法。播放命令的成功回调不等于音频已经播完,后续网络或解码异常仍可能通过 error 返回。
返回值说明
initPlayer 的成功结果包含 initialized 与 capabilities。其他控制操作的成功结果可能随平台不同;需要完整状态时使用对应查询 API。
播放器状态 getPlayerState
| 字段 | 类型 | 说明 |
|---|---|---|
initialized |
boolean | 是否已初始化 |
status |
string | idle / ready / playing / paused / stopped / ended / waitingNext / buffering |
currentTrack |
object/null | 当前曲目信息 |
currentTime、duration、buffered |
number | 当前进度、总时长、已缓冲位置,单位秒;未知时可能为 0 |
playbackRate、volume |
number | 当前记录的倍速和音量;不能据此证明所有平台实际输出相同 |
loopMode |
string | 当前循环方式 |
queueIndex、queueLength |
number | 当前下标与队列长度,无当前项时下标可能为 -1 |
backgroundActive |
boolean | 播放器报告的后台活跃状态,不是长期存活保证 |
队列状态 getQueueState
| 字段 | 类型 | 说明 |
|---|---|---|
tracks |
BackgroundAudioTrack[] | 当前曲目列表 |
currentIndex |
number | 当前项下标,从 0 开始;空队列为 -1 |
平台能力 getCapabilities
| 字段 | 类型 | 说明 |
|---|---|---|
supported |
boolean | 是否存在可用播放能力 |
backgroundAudio |
boolean | 是否提供后台音频能力 |
mediaSession、remoteCommand |
boolean | 是否提供媒体信息及系统控制接入 |
queue、playbackRate、volume |
boolean | 是否提供队列、倍速、音量接口能力 |
platform |
string | 当前平台标识 |
sessionLevel |
string | native / manager / fallback / none;降级结果不等于完整后台能力 |
adapter |
string | 当前播放方式的说明 |
requiresCustomBase |
boolean | 适配器给出的打包提示,仍需满足后文的平台配置 |
事件与回调
on(eventName, callback) 注册事件,off(eventName, callback) 取消订阅。事件对象包含 name、payload 与毫秒时间戳 timestamp。payload 的字段依事件和平台不同,使用前检查是否存在。
subscribe(eventName, callback) 返回独立的字符串 token,其回调收到 BackgroundAudioSubscriptionEvent:包含 subscriptionId(本次 token)、name、payload(可为 null)和毫秒时间戳 timestamp。旧 on 回调结构保持不变。
每次成功注册都会取得新的 token,即使传入同一个回调也不合并。未知事件、当前平台未实现的事件或无效回调返回空字符串,不建立订阅。unsubscribe(token) 首次取消有效订阅返回 true;空、未知或已取消的 token 返回 false。token 仅用于当前插件实例,不保存到本地或跨应用重启复用;调用异常应由业务捕获并显示失败。
| 事件 | 什么时候收到 | 主要用途 |
|---|---|---|
stateChange |
播放状态改变 | 根据 payload.status 更新按钮与提示 |
progress |
播放位置更新 | 读取 currentTime / duration / buffered,单位秒 |
buffer |
进入缓冲或缓冲状态变化 | 显示加载状态 |
error |
播放运行或命令处理发生异常 | 查看 errCode / errMsg / details |
ended |
当前播放结束 | 更新结束状态;不能单凭该事件认定整张歌单结束 |
preloadNext |
队列末尾需要业务提前补充下一曲 | 获取下一集;可读取 currentTrack / currentIndex / remainTime |
waitingNext |
当前曲结束但下一曲尚未到达 | 显示等待状态 |
nextTrackTimeout |
等待下一曲超过设定时间 | 显示重试入口 |
remoteCommand |
系统媒体卡、锁屏或耳机发出命令 | 查看 command,常见 play / pause / stop / next / prev / seek / setSpeed |
interruption |
系统音频中断、音频焦点变化或恢复 | 刷新页面状态,平台字段可能为 reason / action / type |
循环和自动续播过程可能在平台内部处理完成事件,不能把 ended 当作所有平台每首必到的计数器。remoteCommand 的具体命令依系统而定;存在 handled=true 时表示已经处理,deferToPage=true 时才需要业务根据自己的列表决定后续行为。
订阅边界: 当前 Android、iOS、微信小程序以及公共入口的 off 会清空指定事件的订阅组;Harmony 和 Web 可以按传入函数取消。请始终保存并传入同一函数引用,跨页面共享播放器时统一管理订阅,避免页面卸载影响另一个页面的同名事件。
使用独立订阅时,保存 token 并用 unsubscribe 取消;旧 off 不会清理 subscribe 创建的订阅,unsubscribe 也不会清理旧 on 监听。两套接口混用时不依赖它们之间的回调先后顺序。
subscribe 的事件支持范围如下;注册成功表示已接收订阅,具体事件仍需满足对应的播放或系统条件:
| 平台 | 可订阅事件 |
|---|---|
| Android | 上表全部 10 个事件 |
| iOS | stateChange、progress、buffer、error、ended、remoteCommand、interruption,共 7 个 |
| Harmony | 除 interruption 外的 9 个事件 |
| Web、微信小程序 | stateChange、progress、buffer、error、ended、remoteCommand,共 6 个 |
支持平台
| 平台 | 是否支持 | 说明 |
|---|---|---|
| uni-app | 是 | Vue2 / Vue3,平台功能按下表范围使用 |
| uni-app x | 是 | 使用 UTS 脚本;App / Web / 微信小程序按实际运行环境能力使用 |
| Android | 是 | 后台播放、媒体通知、队列、进度、倍速;倍速需要 Android 6.0 及以上 |
| iOS | 是 | iOS 12.0 及以上,后台音频、锁屏控制、队列和进度等 |
| Harmony | 是 | 播放、队列、系统媒体卡和后台音频;不支持插件音量设置 |
| Web | 部分能力 | 浏览器音频播放;系统媒体信息依浏览器支持,不承诺稳定后台播放 |
| 微信小程序 | 部分能力 | 优先后台音频;不可用时降级为普通音频,能力以查询结果为准 |
| 支付宝小程序 | 暂不建议接入 | 当前尚未提供完整可调用能力,不按正式支持平台使用 |
| 其他平台 | 不承诺支持 | 按实际错误和能力结果处理,不以其他平台的调用成功作为依据 |
需要按平台处理的差异
- 倍速: Android、iOS 和 Web 的可播范围受系统、浏览器、编码格式影响;小程序依运行环境提供的能力。Harmony 会把正数映射到最近的
0.5 / 0.75 / 1 / 1.25 / 1.5 / 1.75 / 2档,状态中的请求值不能证明实际已按更高倍速播放。 - 音量: Android / iOS / Web 可调用;Harmony 不支持。小程序后台音频通常不能通过插件设置音量,普通音频降级模式可能可用,先查看
volume能力。 - 系统控制: App 提供媒体卡接入;Android 13 及以上可能按系统规则决定按钮位置。Web 需要浏览器支持媒体控制;微信依后台管理器能力。
- 循环: iOS 当前提供多曲列表循环;单曲循环和仅一项列表循环尚未实现自动重播。Web 可使用单曲循环,列表自动循环不能仅凭设置成功认定已支持;小程序同样需要按平台处理自动续播业务。
- 动态下一曲: Android / Harmony 提供提前通知、等待与超时处理;iOS、Web、小程序不应依赖这组三个事件及等待期间的自动续播。
- 中断恢复: iOS 按
autoRecover与系统是否允许恢复共同决定;Android 等平台的焦点恢复通知不等于自动恢复播放,业务应根据真实状态更新 UI。 - 音源与封面: HTTPS 地址最便于多端复用;本地文件、请求头、封面 data URI 和特殊编码格式不能按统一参数类型推定全平台支持。使用需要鉴权的地址前,先验证目标平台的实际播放请求。
错误码说明
失败对象通常包含 errSubject='lizhao-bg-audio'、errCode、errMsg 和可选的 details。定位问题时同时保留错误码、信息及当前操作,不要只记录“播放失败”。
| 错误码 | 含义 | 说明 |
|---|---|---|
9012001 |
当前平台不支持 | 检查目标平台与能力查询结果 |
9012002 |
参数不合法 | 检查曲目、队列、下标、倍速和音量范围 |
9012003 |
运行时未初始化 | 先等待 initPlayer 成功;部分操作还要求音频已就绪 |
9012004 |
音源不可用 | 检查曲目是否存在、地址是否有效及能否访问 |
9012005 |
播放失败 | 检查网络、音频格式和 details 中的原因 |
9012006 |
跳转位置非法 | 传入有效秒数,并确认音源可以定位 |
9012007 |
能力不支持 | 隐藏或禁用当前环境不可用的操作 |
9012008 |
缺少后台音频能力 | 检查平台前置条件;Harmony 不支持音量设置时也可能返回此码,以错误信息为准 |
注意事项
- 首次在 App 使用时,安装包含本插件的自定义基座或正式包;原生逻辑或平台配置变化后需重新制作对应平台安装包,iOS 原生修复不能仅通过页面资源或 WGT 更新生效。只改页面和文档通常无需重打 Android 自定义基座。
- Android 网络音频需要网络访问能力,媒体通知受系统通知与后台策略影响;iOS 后台收听需要启用
UIBackgroundModes: audio。使用标准基座出现插件不可用时,先改用包含本插件的安装包。 - Harmony 后台收听需要在应用
EntryAbility声明backgroundModes: ["audioPlayback"],并声明ohos.permission.INTERNET和ohos.permission.KEEP_BACKGROUND_RUNNING;修改配置后重新打包。 - 微信后台音频需按平台要求配置
requiredBackgroundModes: ["audio"]。浏览器通常要求由用户点击发起首次播放。 - 系统省电、强制关闭应用、断网、音源失效与其他应用争用音频,都可能影响后台播放;不要把能力查询中的
backgroundAudio=true当作持续播放保证。 - 播放器供应用共享,不为每个页面创建独立实例。普通页面卸载时解除页面事件,主动结束收听业务时再
stop;应用级下一曲业务监听应随收听业务管理。 setPlaylist、setTrack或播放控制的成功,表示本次命令已处理;真实可听状态应结合stateChange、progress和错误事件判断。- 不要在每次进度更新时保存数据库、弹 Toast 或发起网络请求。音频地址和日志可能含鉴权参数,反馈前请去掉账号、口令、Token 等敏感内容。
联系方式
信-微:l-z-1-8-7-1512-5421(去掉短横线)
作者系列 UTS 插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |
lizhao-camera-pro |
原生相机、拍照录像、水印与媒体保存 | 查看插件 |
lizhao-tcp-pro |
TCP 客户端、服务端、多连接与诊断 | 查看插件 |
lizhao-notify-pro |
本地通知、点击动作、进度与定时提醒 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(1)
下载 6486
赞赏 5
下载 12709037
赞赏 1957
赞赏
京公网安备:11010802035340号