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

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

【问题现象】

使用音频播放,创建并设置AVSessionManager会话,设置播放状态后通知栏进度不会更新;通知栏下拉后更新恢复正常;锁屏后打开恢复正常更新。

【背景知识】

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

【定位思路】

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

【解决方案】

  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}`);
    });
    
  2. 正确初始化播控中心的播放资源,并在状态变化时更新,防止播放停止或播放进度计算错误。

    系统的播控中心会根据应用设置的资源时长、播放状态(暂停、播放)、播放位置、倍速等信息自行进行播放进度的计算,而不需要应用实时更新播放进度,代码如下:

    // 设置状态: 播放状态,进度位置,播放倍速,缓存的时间
    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`);
      }
    });
    

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

    按上述思路排查,确认导致当前问题的原因是:播控中心的播放状态初始化错误导致播放进度计算失败而不更新,在下拉状态栏或锁屏后重新设置了播放状态后恢复正常。最终按上述代码初始化后问题解决。

【总结】

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


更多关于HarmonyOS 鸿蒙Next中如何解决音频播放控制通知栏进度状态不更新问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next中如何解决音频播放控制通知栏进度状态不更新问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,音频播放控制通知栏进度状态不更新的问题

音频播放控制通知栏进度状态不更新的问题,通常与音频服务的状态同步机制有关。首先,确保你的应用正确实现了AVSession接口,并通过AVSessionController更新播放状态。检查是否在播放状态变化时调用了AVSessionControllersetPlaybackState方法,并确保传入的PlaybackState对象包含正确的进度信息。

其次,确认你的应用在后台运行时,系统未限制其资源使用。鸿蒙系统可能会对后台应用进行资源管理,导致状态更新不及时。可以通过AbilityonBackground方法中保持必要的资源访问权限。

另外,检查是否在AVSessionsetMetadata方法中正确设置了MediaMetadata,确保包含METADATA_KEY_DURATIONMETADATA_KEY_PLAYBACK_STATE等关键信息。如果这些信息缺失或不正确,通知栏的进度状态可能无法正常更新。

最后,确保你的应用在播放过程中正确处理了系统事件,如音频焦点变化、设备连接状态变化等。这些事件可能会影响音频播放状态,进而影响通知栏的进度更新。通过实现AudioManager.OnAudioFocusChangeListener等接口,确保在这些事件发生时及时更新播放状态。

回到顶部