如何解决音频播放控制通知栏的进度状态不更新的问题
发布: (2026年2月27日 GMT+8 15:46)
4 分钟阅读
原文: Dev.to
Source: Dev.to
Problem Description
在播放音频时,创建并设置 AVSessionManager 会话后出现以下情况:
- 设置播放状态后,通知栏中的进度条不更新。
- 下拉通知栏后恢复正常更新。
- 锁定屏幕后再解锁也会恢复正常更新。
背景知识
- AVSession Kit – 系统提供的音视频控制服务,统一管理系统内所有音视频活动。
- Background Tasks Kit – 后台任务管理。应用进入后台后,资源受到严格控制。应用应选择合适的后台任务以确保持续运行。
- Media Session Provider – 允许音视频应用从媒体会话控制器获取媒体相关信息,并响应控制器发出的播放控制指令。
故障排除流程
- 验证已应用长时间运行任务 AUDIO_PLAYBACK。
- 确保资源时长、播放状态、播放位置、速度等信息设置正确。广播控制中心使用这些数据来显示进度。
Analysis Conclusion
在广播控制中心初始化播放状态时出现错误,导致播放进度计算失败,进度条未更新。下拉状态栏或锁定/解锁屏幕会强制系统重新计算并显示正确的进度。
解决方案
1. 申请长期任务
使用 BackgroundTasks Kit 请求 AUDIO_PLAYBACK 长时任务,以防止应用进入挂起状态。
backgroundTaskManager.startBackgroundRunning(
this.context,
backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,
wantAgentObj
).then(() => {
console.info("Operation startBackgroundRunning succeeded");
}).catch((error: BusinessError) => {
console.error(`Operation startBackgroundRunning failed. code is ${error.code} message is ${error.message}`);
});
2. 正确初始化并更新播放资源
为 AVSession 设置播放状态。系统会根据提供的信息自动计算进度;无需由应用实时更新进度。
let playbackState: AVSessionManager.AVPlaybackState = {
state: AVSessionManager.PlaybackState.PLAYBACK_STATE_PLAY,
position: {
elapsedTime: 1000, // milliseconds elapsed since start
updateTime: new Date().getTime() // timestamp of the update
},
speed: 1.0,
bufferedTime: 14000 // buffered duration in milliseconds
};
session.setAVPlaybackState(playbackState, (err) => {
if (err) {
console.error(`Failed to set AVPlaybackState. Code: ${err.code}, message: ${err.message}`);
} else {
console.info(`SetAVPlaybackState successfully`);
}
});
注意
- 仅在播放 状态、位置或速度发生变化时才更新
AVPlaybackState;否则系统可能出现计算错误。 - 播放开始时,报告初始位置。如果媒体正在缓冲,首先将状态设置为
AVSessionManager.PlaybackState.PLAYBACK_STATE_BUFFERING,以告知系统不要刷新进度条。
验证结果
系统的播放控制中心现在会根据播放状态自动计算并刷新进度条。应用程序只需在速率、位置或其他相关信息更改时更新状态。