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对象。
因为AVSessionController可以直接获取到媒体状态信息监听变化以及对媒体的播控,看了下官方的媒体卡片demo发现比较复杂,还要创建数据库、同步不同进程的播放信息、状态等等,如果能直接获取到AVSessionController就很方便了。
更多关于HarmonyOS 鸿蒙Next中AVSession setAVPlaybackState相关问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
问题一:进度条置灰时间显示异常
除了在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设计,具体实现细节可能随版本更新调整)