HarmonyOS 鸿蒙Next中AVSession setAVPlaybackState相关问题

HarmonyOS 鸿蒙Next中AVSession setAVPlaybackState相关问题

问题一

如上代码已经设置了播放速度,播放模式,播放进度position,媒体时长duration,而且setAVPlaybackState成功了;但是通知栏和媒体中心的进度条置灰时间还是为–:--

原因:还要在session.setAVMetadata中需要设置duration,而且duration的单位是毫秒

问题二

AVPlaybackState的position的updateTime为new Date().getTime()的问题,但是用这个时间戳有bug,因为用户可以修改系统时间:

修改了系统时间后,通知栏和播控中心的进度条就显示错误!

鸿蒙也有类似于Android的SystemClock.elapsedRealtime()的方法:systemDateTime.getUptime(),但是把position的updateTime设置为systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, false)后,播控中心进度条一直显示错误!

问题三

EntryFormAbility或者卡片组件如何获取自己应用的通过UIAbility创建的avSession的AVSessionController对象?

媒体会话控制方通过AVSessionManager创建AVSessionController对象。

媒体会话控制方只能是系统应用吗?自己应用的EntryFormAbility和卡片组件所在的进程就不能获取到自己应用主进程创建的avSession的AVSessionController对象吗?

因为AVSessionController可以直接获取到媒体状态信息监听变化以及对媒体的播控,看了下官方的媒体卡片demo发现比较复杂,还要创建数据库、同步不同进程的播放信息、状态等等,如果能直接获取到AVSessionController就很方便了。


更多关于HarmonyOS 鸿蒙Next中AVSession setAVPlaybackState相关问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

问题一:进度条置灰时间显示异常

除了在setAVPlaybackState中设置duration字段外,应该同时在setAVMetadata方法中明确设置媒体总时长属性。试一试:

// 在设置播放状态前同步设置元数据
let metadata: avSession.AVMetadata = {
  duration: this.getDuration() <= 0 ? undefined : this.getDuration(), // 单位:毫秒
  // 其他元数据字段(如标题)
};
this.session?.setAVMetadata(metadata);

问题二:系统时间修改导致进度异常

updateTime若采用系统时间(new Date().getTime()),当用户修改系统时间会导致播放进度计算错误。

应该使用systemDateTime.TimeType.STARTUP类型获取设备启动后的累计时间。

import systemDateTime from '@ohos.systemDateTime';

// 获取系统启动后的运行时间(不依赖系统时间)
let updateTime = systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, true); // 获取纳秒级时间戳
// 转换为毫秒并赋值
position: {
  elapsedTime: this.getPosition(),
  updateTime: Math.floor(updateTime / 1000000) // 纳秒转毫秒
}

问题三:跨进程获取AVSessionController

不会。

更多关于HarmonyOS 鸿蒙Next中AVSession setAVPlaybackState相关问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


验证了下,第二个问题确实会有,估计是个bug,需要官方修复下。

第三个问题,跨进程获取不了AVSessionController,因为都不在一个进城了,上下文都不一样。

在HarmonyOS Next中,AVSession.setAVPlaybackState()用于设置媒体播放状态。该方法接收一个AVPlaybackState对象参数,包含播放状态(如playing/paused)、播放位置、速度和循环模式等信息。使用时需在config.json中声明ohos.permission.MANAGE_MEDIA_RESOURCES权限。典型场景是在媒体控制类应用中对当前播放状态进行更新,确保状态与界面显示同步。注意状态变更会触发AVSession的回调事件。需确保AVSession已正确创建并激活后再调用此方法。

关于问题一:确实需要在setAVMetadata中同时设置duration(毫秒单位),通知栏和媒体中心才能正确显示进度条。这是HarmonyOS Next的设计要求,两个接口的duration需要保持一致。

关于问题二:updateTime建议使用systemDateTime.getUptime()获取系统启动时间而非当前时间。如果出现显示错误,可能是播控中心还未适配这种时间类型,建议检查时间戳计算逻辑是否正确(elapsedTime是否同步更新)。

关于问题三:非系统应用也可以获取AVSessionController。同一应用的不同组件(如EntryFormAbility)可以通过AVSessionManager.createController(sessionId)获取到本应用创建的session控制器,前提是知道正确的sessionId。不需要通过数据库同步,但需要注意跨进程通信的时序问题。

(注:以上回答基于HarmonyOS 4.0/Next的公开API设计,具体实现细节可能随版本更新调整)

回到顶部