HarmonyOS鸿蒙Next中音频状态不更新

HarmonyOS鸿蒙Next中音频状态不更新 如何解决音频播放控制通知栏进度状态不更新问题

3 回复

【背景知识】

  • AVSession Kit:系统提供的音视频管控服务,统一管理系统中所有音视频行为。
  • Background Tasks Kit:后台任务管理;应用切到后台后资源会受到严格管控,应当选择合适的后台任务,以满足应用退至后台后继续运行的需求。
  • 媒体会话提供方:音视频应用控制媒体会话控制方的媒体相关信息,及响应媒体会话控制方下发的播控命令。

【问题定位】

  1. 对媒体类播放来说,通知栏进度条不生效,首先排查是否申请了AUDIO_PLAYBACK的长时任务;
  2. 排查是否正确设置了资源的时长、播放状态、播放位置、倍速等信息,播控中心会使用这些信息进行进度的展示。

【修改建议】

  1. 申请长时任务,避免进入挂起(Suspend)状态导致播放停止。当应用需要实现后台播放等功能时,需要使用BackgroundTasks Kit的能力,申请对应的长时任务,避免进入挂起(Suspend)状态。对媒体类播放来说,需要申请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}`);
});
  1. 正确初始化播控中心的播放资源,并在状态变化时更新,防止播放停止或播放进度计算错误。系统的播控中心会根据应用设置的资源时长、播放状态(暂停、播放)、播放位置、倍速等信息自行进行播放进度的计算,而不需要应用实时更新播放进度,示例代码如下:
// 设置状态:播放状态,进度位置,播放倍速,缓存的时间
let playbackState: AVSessionManager.AVPlaybackState = {
  state: AVSessionManager.PlaybackState.PLAYBACK_STATE_PLAY, // 播放状态
  position: {
    elapsedTime: 1000, // 已经播放的位置,以ms为单位
    updateTime: new Date().getTime(), // 应用更新当前位置时的时间戳,以ms为单位
  },
  speed: 1.0, // 可选,默认是1.0,播放的倍速,按照应用内支持的speed进行设置,系统不做校验
  bufferedTime: 14000, // 可选,资源缓存的时间,以ms为单位
};
session.setAVPlaybackState(playbackState, (err) => {
  if (err) {
    console.error(`Failed to set AVPlaybackState. Code: ${err.code}, message: ${err.message}`);
  } else {
    console.info(`SetAVPlaybackState successfully`);
  }
});

具体可参考示例代码:MeidaProvider

注意

  • 只有当播放媒体的播放状态(state)、播放位置(position)、播放倍速(speed)发生变化的时候,才需要再更新会话播放状态(AVPlaybackState),否则系统会发生计算错误。
  • 应用在真实播放开始时,再上报进度起始播放位置(position);若播放存在缓冲(buffer)状态,可以先上报播放状态为AVSessionManager.PlaybackState.PLAYBACK_STATE_BUFFERING来通知系统不刷新进度。

【总结】

系统的播控中心播放进度会根据播放状态进行自动计算并刷新,应用只需要再播放的速率、位置等信息发生变化时更新即可。

更多关于HarmonyOS鸿蒙Next中音频状态不更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,音频状态未更新可能涉及系统服务或应用状态管理问题。需检查AudioManager的音频流状态监听是否正常注册,并确认应用生命周期内未发生状态回调丢失。排查系统音频焦点策略是否影响状态同步,同时验证应用使用的媒体会话(MediaSession)是否及时响应状态变更。若使用ArkTS开发,需确保状态变量绑定正确,避免UI未刷新。

在HarmonyOS Next中遇到音频播放控制通知栏进度状态不更新的问题,通常与生命周期管理和状态同步机制有关。以下是关键排查点:

  1. 检查AVSession状态同步
    确保使用AVSession正确提交播放状态:

    avSession.setAVPlaybackState({
      state: avSession.PlaybackState.PLAYBACK_STATE_PLAYING,
      speed: 1.0,
      position: { elapsedTime: currentPosition }
    })
    
  2. 验证媒体数据更新
    通过setAVMetadata及时更新进度:

    avSession.setAVMetadata({
      duration: totalDuration,
      title: "当前播放"
    })
    
  3. 监听播放状态回调
    on('play')/on('pause')回调中强制刷新状态:

    avSession.on('play', () => {
      updateNotificationProgress()
    })
    
  4. 进程保活配置
    module.json5中确认后台媒体播放权限:

    "abilities": [{
      "permissions": ["ohos.permission.KEEP_BACKGROUND_RUNNING"]
    }]
    
  5. 使用AVPlayer回调
    通过timeUpdate事件触发状态同步:

    avPlayer.on('timeUpdate', (currentTime) => {
      avSession.setAVPlaybackState({ 
        position: { elapsedTime: currentTime }
      })
    })
    

注意检查事件触发频率,避免过度更新导致性能问题。若使用Service进行后台播放,需确保Service与UI的状态绑定机制正确。

回到顶部