更新记录
1.0.8(2026-04-22)
- Android 补齐通知栏媒体控制:新增上一首/播放暂停/下一首/停止动作,支持在后台从通知栏直接发起媒体命令。
- Android 补齐前台服务保活:新增
BackgroundAudioForegroundService,播放期常驻媒体通知,降低后台被系统回收风险。
- Android 新增通知通道与媒体通知同步:曲目标题、歌手/专辑信息与播放状态会随
MediaSession 状态联动刷新。
- Android Manifest 新增前台服务声明(
foregroundServiceType=mediaPlayback)。
- iOS 升级回原生媒体链路:
AVPlayer + AVAudioSession + MPRemoteCommandCenter + MPNowPlayingInfoCenter(含远程命令桥接与播放信息同步)。
- Harmony 移除 stub 占位实现,补齐为
BackgroundAudioManager + InnerAudioContext 双引擎可用实现(含能力探测、事件回调、错误码路径)。
- 文档同步更新 Android/iOS/Harmony 实现能力,版本号升级到
1.0.8。
平台兼容性
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 是纯 UTS 背景音频播放器 API 插件,提供统一的播放控制、队列管理、远程控制事件与错误码体系。
支持平台
| 平台 |
是否支持 |
说明 |
| uni-app |
是 |
Vue2/Vue3 可用 |
| uni-app x |
是 |
多端可用 |
| Android |
是 |
已升级为 MediaPlayer + MediaSession + AudioFocus + 前台服务 + 通知栏媒体控制 原生链路 |
| iOS |
是 |
AVPlayer + AVAudioSession + MPRemoteCommandCenter + MPNowPlayingInfoCenter 原生链路 |
| Harmony |
是 |
优先 getBackgroundAudioManager(),不可用时自动回退 InnerAudioContext |
| Web |
是 |
HTMLAudioElement + MediaSession(可用时) |
| 微信小程序 |
是 |
优先 getBackgroundAudioManager(),不可用时自动回退 InnerAudioContext |
| 支付宝小程序 |
是 |
优先 getBackgroundAudioManager(),不可用时自动回退 InnerAudioContext |
技术实现说明
| 平台 |
当前实现技术 |
原生增强目标技术 |
| Android |
MediaPlayer + MediaSession + AudioFocus + 前台服务 + 通知栏媒体控制 |
继续增强通知样式、封面与系统会话稳定性(可选演进到 ExoPlayer) |
| iOS |
AVPlayer + AVAudioSession + MPRemoteCommandCenter + MPNowPlayingInfoCenter |
持续增强系统会话稳定性与中断恢复策略 |
| Harmony |
getBackgroundAudioManager() -> InnerAudioContext(fallback) |
AVPlayer + AVSession |
| Web |
HTMLAudioElement + MediaSession(可用时) |
保持浏览器原生媒体栈(受浏览器后台策略限制) |
| 微信小程序 |
getBackgroundAudioManager() -> InnerAudioContext(fallback) |
保持小程序后台音频管理器能力 |
| 支付宝小程序 |
getBackgroundAudioManager() -> InnerAudioContext(fallback) |
保持小程序后台音频管理器能力 |
会话层级说明
| 层级 |
含义 |
适用平台 |
| native |
原生系统会话实现(系统媒体控制能力最完整) |
Android / iOS |
| manager |
基于运行时后台音频管理器封装 |
Harmony / 微信小程序 / 支付宝小程序 |
| fallback |
非后台会话,提供前台播放与有限媒体会话能力 |
Web(支持 MediaSession 时) |
| none |
当前环境无可用会话能力 |
能力探测失败场景 |
安装说明
import * as LizhaoBackgroundAudio from '@/uni_modules/lizhao-bg-audio'
目录结构说明
uni_modules/
└─ lizhao-bg-audio/
├─ package.json
├─ readme.md
├─ changelog.md
├─ example/
└─ utssdk/
├─ interface.uts
├─ unierror.uts
├─ index.uts
├─ app-android/
│ └─ index.uts
├─ app-ios/
│ └─ index.uts
├─ app-harmony/
│ └─ index.uts
├─ web/
│ └─ index.uts
├─ mp-weixin/
│ └─ index.uts
└─ mp-alipay/
└─ index.uts
API 列表
initPlayer(options)
setTrack(options)
play(options)
pause(options)
resume(options)
stop(options)
seek(options)
setPlaybackRate(options)
setVolume(options)
setLoopMode(options)
setPlaylist(options)
appendTrack(options)
removeTrack(options)
skipToNext(options)
skipToPrev(options)
skipToIndex(options)
getPlayerState(options)
getQueueState(options)
getCapabilities(options)
on(eventName, callback)
off(eventName, callback)
initPlayer(options)
说明
初始化播放器运行时并返回平台能力矩阵。
支持平台
Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
InitPlayerOptions |
是 |
初始化参数对象 |
无 |
autoRecover / autoRegisterRemoteCommand / success / fail / complete |
| options.autoRecover |
boolean |
否 |
是否允许自动恢复播放状态 |
true |
true / false |
| options.autoRegisterRemoteCommand |
boolean |
否 |
是否自动注册系统远程控制命令桥 |
true |
true / false |
| options.success |
function |
否 |
成功回调,返回初始化结果与能力矩阵 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
setTrack(options)
说明
设置当前播放曲目与媒体元数据。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
SetTrackOptions |
是 |
设置曲目参数对象 |
无 |
track / success / fail / complete |
| options.track |
BackgroundAudioTrack |
是 |
当前曲目信息 |
无 |
id / url / title / singer / album / cover / durationHint / headers / extras |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
play(options) / pause(options) / resume(options) / stop(options)
说明
控制播放状态。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
PlayOptions/ActionOptions |
是 |
控制参数对象 |
无 |
startPosition / success / fail / complete |
| options.startPosition |
number |
否 |
从指定秒数开始播放(仅 play) |
0 |
大于等于 0 的数值 |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
seek(options) / setPlaybackRate(options) / setVolume(options) / setLoopMode(options)
说明
设置播放进度、倍速、音量、循环模式。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
SeekOptions/SetPlaybackRateOptions/SetVolumeOptions/SetLoopModeOptions |
是 |
参数对象 |
无 |
position / playbackRate / volume / loopMode / success / fail / complete |
| options.position |
number |
否 |
目标播放秒数(seek) |
无 |
大于等于 0 的数值 |
| options.playbackRate |
number |
否 |
播放倍速(setPlaybackRate) |
1 |
正数 |
| options.volume |
number |
否 |
音量(setVolume) |
1 |
0~1 |
| options.loopMode |
string |
否 |
循环模式(setLoopMode) |
off |
off / single / all |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
setPlaylist(options) / appendTrack(options) / removeTrack(options) / skipToNext(options) / skipToPrev(options) / skipToIndex(options)
说明
管理播放队列与切歌控制。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
SetPlaylistOptions/AppendTrackOptions/RemoveTrackOptions/ActionOptions/SkipToIndexOptions |
是 |
队列相关参数对象 |
无 |
tracks / startIndex / track / trackId / index / success / fail / complete |
| options.tracks |
Array |
否 |
设置整队列(setPlaylist) |
无 |
无 |
| options.startIndex |
number |
否 |
起始播放下标(setPlaylist) |
0 |
大于等于 0 |
| options.track |
BackgroundAudioTrack |
否 |
追加曲目(appendTrack) |
无 |
无 |
| options.trackId |
string |
否 |
移除曲目 ID(removeTrack) |
无 |
无 |
| options.index |
number |
否 |
目标下标(skipToIndex) |
无 |
大于等于 0 |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
getPlayerState(options) / getQueueState(options) / getCapabilities(options)
说明
获取播放器状态、队列状态与能力矩阵。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GetPlayerStateOptions/GetQueueStateOptions/GetCapabilitiesOptions |
是 |
查询参数对象 |
无 |
success / fail / complete |
| options.success |
function |
否 |
成功回调 |
无 |
无 |
| options.fail |
function |
否 |
失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
on(eventName, callback) / off(eventName, callback)
说明
订阅/取消订阅播放器事件。
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| eventName |
string |
是 |
事件名称 |
无 |
stateChange / progress / buffer / error / ended / remoteCommand / interruption |
| callback |
function |
是 |
事件回调 |
无 |
无 |
返回值说明
BackgroundAudioTrack
| 字段 |
类型 |
说明 |
| id |
string |
曲目唯一标识 |
| url |
string |
音频地址 |
| title |
string |
曲目标题 |
| singer |
string |
歌手 |
| album |
string |
专辑名 |
| cover |
string |
封面图地址 |
| durationHint |
number |
时长提示(秒) |
| headers |
object |
请求头(按平台支持) |
| extras |
object |
扩展字段 |
BackgroundAudioPlayerState
| 字段 |
类型 |
说明 |
| initialized |
boolean |
是否已初始化 |
| status |
string |
当前状态 |
| currentTrack |
BackgroundAudioTrack/null |
当前曲目 |
| currentTime |
number |
当前播放时间(秒) |
| duration |
number |
总时长(秒) |
| buffered |
number |
缓冲进度(秒) |
| playbackRate |
number |
当前倍速 |
| volume |
number |
当前音量 |
| loopMode |
string |
当前循环模式 |
| queueIndex |
number |
当前队列下标 |
| queueLength |
number |
队列长度 |
| backgroundActive |
boolean |
是否处于后台活跃播放态 |
BackgroundAudioCapabilities
| 字段 |
类型 |
说明 |
| supported |
boolean |
平台能力是否可用 |
| sessionLevel |
string |
会话层级:native / manager / fallback / none |
| backgroundAudio |
boolean |
是否支持后台音频 |
| mediaSession |
boolean |
是否支持媒体会话元数据 |
| remoteCommand |
boolean |
是否支持远程控制命令 |
| queue |
boolean |
是否支持队列管理 |
| playbackRate |
boolean |
是否支持倍速 |
| volume |
boolean |
是否支持音量 |
| platform |
string |
平台标识 |
| adapter |
string |
平台适配器标识 |
| requiresCustomBase |
boolean |
是否建议自定义基座 |
错误码说明
| 错误码 |
含义 |
说明 |
| 9012001 |
当前平台不支持 |
当前平台不支持 |
| 9012002 |
参数不合法 |
参数不合法 |
| 9012003 |
运行时未初始化 |
运行时未初始化 |
| 9012004 |
音源不可用 |
音源不可用或曲目缺失 |
| 9012005 |
播放失败 |
播放失败 |
| 9012006 |
跳转位置非法 |
跳转位置非法 |
| 9012007 |
远程控制不支持 |
远程控制或能力不支持 |
| 9012008 |
缺少后台音频能力 |
平台缺少后台音频能力配置 |
权限说明
| 平台 |
是否支持 |
说明 |
| Android |
是 |
需声明网络权限(INTERNET),并建议配置前台服务、媒体会话、通知权限(Android 13+) |
| iOS |
是 |
建议配置 UIBackgroundModes: audio 以稳定后台播放行为 |
| Harmony |
是 |
按运行环境启用后台音频相关能力;缺失时返回 9012008 |
| Web |
是 |
由浏览器策略控制后台行为 |
| 微信小程序 |
是 |
需在 app.json 配置 requiredBackgroundModes: ["audio"] |
| 支付宝小程序 |
是 |
按小程序后台音频规则配置 |
自定义基座说明
- 当前版本未接入三方原生 SDK,但 Android 已新增前台服务与媒体通知声明。
- Android/iOS 已接入系统媒体会话能力,建议使用自定义基座或云打包以确保原生配置完整生效。
- 若新增原生依赖或服务声明,必须同步维护:
- Android:
utssdk/app-android/config.json、AndroidManifest.xml
- iOS:
utssdk/app-ios/Info.plist、UTS.entitlements、PrivacyInfo.xcprivacy
示例(uni-app)
import * as BgAudio from '@/uni_modules/lizhao-bg-audio'
BgAudio.initPlayer({
success(res) {
console.log('init success', res)
}
})
BgAudio.setPlaylist({
tracks: [
{
id: 'track-1',
url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3',
title: 'SoundHelix Song 1',
singer: 'Singer A',
cover: ''
},
{
id: 'track-2',
url: 'https://www.learningcontainer.com/wp-content/uploads/2020/02/Kalimba.mp3',
title: 'Kalimba',
singer: 'Singer B'
}
],
startIndex: 0,
success() {
BgAudio.play({})
}
})
BgAudio.on('remoteCommand', (event) => {
console.log('remote command', event.payload)
})
示例(uni-app x)
import * as BgAudio from '@/uni_modules/lizhao-bg-audio'
BgAudio.initPlayer({
success() {
BgAudio.setTrack({
track: {
id: 'single-1',
url: 'https://download.samplelib.com/mp3/sample-3s.mp3',
title: 'Sample 3s'
},
success() {
BgAudio.play({ startPosition: 0 })
}
})
}
})
BgAudio.on('progress', (event) => {
console.log('progress', event.payload)
})
注意事项
- 非 App 平台按“能力探测 + 明确降级/报错”执行,不伪造成功返回。
setVolume 在部分小程序平台可能不支持,将返回 9012007。
- Android 已支持系统级会话回调,建议重点回归锁屏/通知栏/耳机线控场景。
- iOS 已启用
MPRemoteCommandCenter 远程控制桥接与 MPNowPlayingInfoCenter 元数据同步。
- Harmony 当前仍为
BackgroundAudioManager + InnerAudioContext 双引擎策略,后续可继续演进到更原生的 AVSession 链路。