HarmonyOS上视频跨设备协同技术超全详解 精华
1. 介绍
您将会学到什么
● 如何使用PageSlider、PageSliderIndicator和ListContainer编写定时滚动及可滑动的页面。
● 如何使用分布式能力实现跨设备视频播放。
● 如何使用HarmonyOS IDL跨进程通信实现远程控制视频播放。
技能要求
● HarmonyOS Player接口熟练使用
● 基本组件熟练使用
🕮 说明
本篇Codelab所附代码适合在真机运行。运行时需要至少两台手机处于同一个分布式网络中,可以通过操作如下配置实现:● 所有手机接入同一网络
● 所有手机登录相同华为账号
● 所有手机上开启“设置->更多连接->多设备协同 ”
2. 代码结构
在鸿蒙上实现本地和Internet视频资源播放已对视频播放和播放界面代码结构做了讲解,本次Codelab只对视频列表页、视频迁移设备列表、迁移后控制界面及迁移服务核心代码做讲解,对于完整代码,我们会在参考提供下载方式。代码结构图如下:
● provider:该目录包含CommonProvider、ViewProvider和AdvertisementProvider。CommonProvider是一个ListContainer 多样式提供者管理类。ViewProvider结合CommonProvider使用,可以把布局文件中需要赋值的控件单独提取出来进行赋值。AdvertisementProvider实现广告视频资源定时滚动的效果。
● ImplVideoMigration.idl:接口中定义了视频迁入、迁出、根据控制码对视频进行远程控制方法。
● data:该目录包括滚动视频广告对象封装、即将上映视频对象封装以及视频图片格式定义。
● VideoMigrateService:供远端连接的Service Ability。
● manager:该目录下的文件为ImplVideoMigration.idl在编译时自行生成,初始生成位置为entry\build\generated\source\idl\com\huawei\codelab。
● MediaUtil:对广告和视频列表对象初始化赋值。
● config.json:配置文件,新增权限配置如下图:
1. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允许监听分布式组网内的设备状态变化。
2. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允许获取分布式组网内的设备列表和设备信息。
3. ohos.permission.GET_BUNDLE_INFO:用于查询其他应用的信息。
4. ohos.permission.DISTRIBUTED_DATASYNC:用于允许不同设备间的数据交换。
5. ohos.permission.INTERNET:用于允许设备访问网络。
3. 创建应用程序布局文件
在路径"resources/base/layout"文件夹下创建video.xml为应用主页面,展示要播放的视频列表。
video.xml采用垂直方向的线性布局方式。整个页面分为三部分的内容。从上至下依次是PageSlider滚动广告布局,即将上映视频图标布局,可左右滑动的listContainer布局。
PageSlider是一个描述滚动页面的组件,PageSliderIndicator是一个将滚动页面组件和其它组件比如图标、按钮等组合管理的管理器。本应用程序展示的滚动广告页面采取的是三组广告图片和图片title组成的PageSlider,广告图片和图片title组合样式由AdvertisementProvider定义。AdvertisementMo初始化代码如下:
AdvertisementProvider对滚动视频广告组件以list形式进行封装。
通过PageSlider对象的setProvider(CommProvider)方法即可达到对图片列表地滚动显示效果。
getAdertisementCompoents方法将滚动视频广告添加到list。
想要实现滚动到某一特定图片时呈现标志,在图片上方加上一组空心圆,当滚动到第一张图片时,第一个圆变为实心,此联动实现效果可通过PageSliderIndicator实现。
实心圆效果:
空心圆效果:
实心圆、空心圆效果如下图:
PageSliderIndicator通过设置可选类型将会实现图片被选中时,将会显示实心圆。
本节任务完成的效果如下图:
视频播放业务本次Codelab不再描述,下面直接进入视频流转环节。
4. 视频跨设备协同
HarmonyOS提供了分布式跨设备能力,本小节可以实现将视频迁移到分布式环境中的其它设备上,被迁移设备可以实现对迁移设备的视频操作控制。
首先对视频播放界面中迁移按钮增加监听事件,在点击时,从窗口底部滑出分布式设备列表界面可供选择迁移。
通过分布式设备管理器DeviceManager获取到当前分布式网络中可发现的所有设备并全部添加到设备列表。如果设备列表初始不为空,先将列表清空,再添加,以达到刷新设备列表效果。
显示设备列表使用单样式的内容提供器CommonProvider,设置设备名字样式。
创建设备列表显示组件SlidePopupWindow。设备列表是一个从底部滑出的一个窗口,属于自定义组件。核心功能是设备列表的显示与隐藏。
设备列表效果如下图:
点击列表中某一个设备,将在已选设备端拉起该视频应用。
通过startAbilityFa()跨设备拉起视频FA,再调用connectAbility()异步对远端服务连接,成功连接后,在回调onAbilityConnectDone中服务端恢复视频数据。
通过指定abilityName为VideoMigrateService,执行VideoMigrateService中onConnect(intent)方法,返回binder对象,回调onAbilityConnectDone拿到具体的binder对象。VideoMigrationStub.asInterface(remoteObject)根据调用是否属于同进程而返回不同的实例对象, 由于返回的binder不是本进程的,所以返回的是VideoMigrationProxy对象。
接下来我们分别把本端设备称为设备A,跨设备协同端称为设备B。 implVideoMigration.flyIn(startMillisecond)由设备A即VideoMigrationProxy执行,通过sendRequest发送到设备B。
设备B通过接收到的code类型为COMMAND_FLY_IN在服务端执行视频数据恢复。
设备B呈现播放界面并跳转到Intent中携带的播放位置。在设备A的视频应用跨设备协同到设备B时,设备A会释放掉视频资源并展示RemoteController。
设备A的RemoteController在创建时初始化界面布局。通过操作界面控件来控制设备B视频播放。例如点击前进按钮,RemoteController发送FORWARD 控制码。SimplePlayerAbilitySlice通过添加RemoteController.RemoteControllerListener来执行回调方法sendControl,再通过implVideoMigration代理对象与对端进行通信。
设备A效果如下图:
设备B效果如下图:
当设备A在RemoteController界面执行返回操作时,会隐藏RemoteController,同时设备A继续播放。
🕮 说明
以上代码仅demo演示参考使用,产品化的代码需要使用国际化。
5. 恭喜你
● 通过使用PageSlider、PageSliderIndicator结合ListContainer编写定时滚动及可滑动的页面。
● HarmonyOS通过DeviceManger获取分布式网络中设备列表,选中设备ID之后,再通过IDL跨进程通信方式将FA或PA携带数据跨设备拉起。
● 整体运行效果图如下:
设备A视频跨设备协同后效果图如下:
至此,您已经完成HarmonyOS上视频跨设备协同的体验!
6. 参考
@文章转载自HUAWEI Codelabs
这长度,确实够全面了。。
可以可以。
gitee失效了大佬