uni.createInnerAudioContext()锁屏下不工作是因未声明后台音频权限,必须用uni.getBackgroundAudioManager()并配置manifest.json的UIBackgroundModes和background.mode。

uni.createInnerAudioContext() 在锁屏下为啥不工作?
因为 iOS 和 Android 系统默认会挂起或暂停非前台应用的音频上下文,uni.createInnerAudioContext() 创建的是“普通音频实例”,它没有声明后台播放意图,锁屏后几秒内就会被系统静音甚至中断。这不是 Bug,是平台策略——系统只允许明确申请了后台音频能力、且使用特定播放通道的应用持续发声。
必须配 manifest.json 的 UIBackgroundModes 和 background.mode
iOS 和 Android 后台音频权限不是 JS 调用就能打开的,得靠原生层“报备”。缺一不可:
- iOS:在
manifest.json的app-plus.distribute.ios.UIBackgroundModes中填["audio"](不是["playback"]或空数组) - Android:在
app-plus.background.mode中设为"audio"(注意不是"location"或留空) - 同时确保
app-plus.modules.Audio为{}(启用音频模块)
漏掉任一配置,iOS 会直接拒绝后台播放,Android 则可能播着播着就断掉,连错误日志都不抛。
锁屏可用的唯一可靠 API 是 uni.getBackgroundAudioManager()
uni.createInnerAudioContext() 适合页面内提示音、短效反馈;但听书这种长时、锁屏、需要系统级控制(如锁屏界面显示封面/进度条)的场景,必须用 uni.getBackgroundAudioManager()。它的设计就是对标系统媒体中心:
- 自动接管系统音频焦点,响应物理按键(如耳机线控)
- 锁屏后仍可播放,并在 iOS 锁屏界面显示专辑图、标题、播放状态
- 支持
onPlay/onPause/onTimeUpdate等事件,便于同步 UI 进度 - 注意:
src必须是有效 URL(本地路径需用/static/xxx.mp3,不能用相对路径或未打包资源)
示例关键片段:
const bgm = uni.getBackgroundAudioManager();
bgm.src = '/static/book_chapter_01.mp3';
bgm.title = '《三体》第一章';
bgm.epname = '三体';
bgm.singer = '原著:刘慈欣';
bgm.coverImgUrl = '/static/santi_cover.jpg'; // 锁屏封面
bgm.onPlay(() => console.log('已开始锁屏播放'));
无声保活 + 后台音频 manager 要配合用,但别迷信“永远不掉”
单纯靠 uni.getBackgroundAudioManager() 播放,某些 Android 厂商(华为 EMUI、小米 MIUI)仍可能因省电策略杀后台。这时候可以叠加“无声音频保活”作为辅助手段:
- 另起一个
uni.createInnerAudioContext()实例,加载 10ms 静音 MP3,设loop = true - 监听
pause事件,在 App 切后台时调用.play(),维持进程活跃度 - 但注意:iOS 上该技巧无效(系统根本不允许后台启动音频),且滥用会导致耗电投诉
真正稳的逻辑是:用 uni.getBackgroundAudioManager() 处理主音频流,用原生定位/消息通道做保活兜底,而不是指望一段静音 MP3 拯救一切。
锁屏听书最常卡住的地方,其实是 manifest 配置漏项和音频文件没打进包里——真机调试前先检查 uni-app 项目/static/ 下的 MP3 是否能被 HBuilderX 正确识别并包含在 APK/IPA 中,否则连第一声都出不来。











