如何解决音频播放控制通知栏的进度状态不更新的问题

发布: (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,以告知系统不要刷新进度条。

验证结果

系统的播放控制中心现在会根据播放状态自动计算并刷新进度条。应用程序只需在速率、位置或其他相关信息更改时更新状态。

相关文档或链接

0 浏览
Back to Blog

相关文章

阅读更多 »