刘丹,董明华,刘正
(1.江苏联合职业技术学院苏州工业园区分院,江苏 苏州 215123;2.苏州工业园区服务外包职业技术学院,江苏 苏州 215123)
近年来,在5G、AIoT 技术的推动下,我国智能电视、智能音箱、智能车载、智能耳机等智能终端行业发展迅速,智能终端上的用户对音乐服务的需求增长非常快。用户在听音乐时,当使用情境发生变化时,之前使用的设备可能不适合继续当前的任务,此时,用户可以选择一键将音乐流转到智慧屏、平板、手表、音箱等鸿蒙设备,使用新的设备来继续播放音乐,音乐播放的无缝流转给用户带来流畅完整的沉浸式体验[1]。
本文利用鸿蒙系统的分布式能力,实现了音乐服务的跨设备流转,主要功能包括:本地音乐列表展示、音乐播放/ 暂停、上一首、下一首和同步音乐到可信设备。系统界面简洁、易用,用户可以方便地完成音乐播放器在不同设备间的流转。
华为鸿蒙系统(HarmonyOS)是一款全新的面向全场景的开源分布式操作系统,为不同设备的互联与协同提供了统一的平台[2],具有分布式架构Kit 提供屏幕布局控件及交互的自动适配功能,使开发者可以基于同一工程高效构建多端自动运行的APP,实现跨设备之间的生态共享[3]。
华为鸿蒙系统采用了支持高性能多语言编译的方舟编译器,能够完成联合优化,提高代码执行效率,性能上不弱于安卓系统[4]。由于鸿蒙系统微内核的代码量只有Linux 宏内核的千分之一,其受攻击概率也大幅降低[5]。鸿蒙系统也因此成为史上发展最快的智能终端操作系统。
鸿蒙的分布式能力是其最大的特点,可以让更多设备组合实现超级终端体验。HarmonyOS 的分布式能力众多,包括分布式软总线、分布式任务调度和分布式数据管理等。分布式任务调度让应用开发者可以聚焦在业务实现上,很方便地开发HarmonyOS 上的分布式应用。
流转在HarmonyOS 中泛指多设备分布式操作,即一个应用程序在某一个设备上运行,用户切换到另外一个设备上继续运行,同时停止在原来设备上的运行。流转能力打破了设备界限,多设备联动,使用户应用程序可分可合、可流转[6]。本文使用的是跨端迁移流转,即在A 端运行的应用程序FA 迁移到B 端上,完成迁移后,FA 在B 端继续执行,而在A 端退出应用[7]。
用户打开APP,提醒用户是否授予读取存储权限和多设备协同访问权限。用户允许后,进入主页,展示本地音乐列表。点击其中的任一首音乐,进入音乐播放界面,展示歌曲名、播放时长等信息,以及“上一首”“下一首”“播放/ 暂停”“流转”等按钮。点击“播放/ 暂停”按钮,实现播放/ 暂停;点击“流转”按钮,获取信任的设备列表,用户选择需要流转的设备,将当前播放的音乐流转到选中的设备上。系统包括以下三个模块:本地音乐列表展示、音乐播放、音乐流转,功能模块图如图1 所示。
各模块具体功能如下:
(1)本地音乐列表展示:读取本地音乐文件,以列表形式展示。
(2)音乐播放:音乐播放界面展示歌曲名、播放时长和播放状态信息。通过界面按钮,实现上一首、下一首、音乐播放、暂停和进度控制。
(3)音乐流转:点击“流转”按钮,弹出查找可信任设备对话框,展示设备查找结果,选中需要流转的设备,同步音乐到该设备,同步信息包括:音乐文件路径、音乐时长和音乐播放状态等。
音乐播放器的主要流程为:打开应用,提示是否授予APP 访问设备上的媒体和使用多设备协同的权限;选择“始终允许”,进入主界面,显示本地音乐列表,点击某一个列表项,进入音乐播放界面。在音乐播放界面可以实现播放/ 暂停音乐,播放上一首、下一首音乐,或者切换播放进度等功能。点击“流转”按钮,选择需要流转的设备,将当前播放音乐流转到新设备上,保持远程设备上播放的音乐和原设备播放的音乐播放状态、播放时长等一致,实现无缝流转。
本系统需要申请的权限有:本地多媒体访问、多设备协同访问权限。具体步骤如下。
3.1.1 静态权限配置
在config.json 中的“reqPermissions”字段中声明所需要的权限,该字段对应的value 值是一个数组,里面可以有多个对象,每个对象描述了一个权限。
以上代码,分别申请了读取存储权限、多设备协同访问权限。
3.1.2 动态权限配置
使用ohos.app.Context.verifySelfPermission()接口查询应用是否已被授予权限,如果未被授予权限,使用canRequestPermission()查询是否可动态申请权限,再使用requestPermissionsFromUser()动态申请多个权限。
3.1.3 权限申请成功回调
APP 在使用危险权限时,需要用户授权后,才可进一步操作。重写ohos.aafwk.ability.Ability 的回调函数onRequestPermissionsFromUserResult()接收授予结果。读取存储权限申请成功后,调用MainAbilitySlice 类自定义的initListContainer()方法,依据读取到的音乐信息,设置ListContainer 数据源。
鸿蒙操作系统提供了可复用列表项的列表组件ListContainer,使用媒体外部存储提供的文件路径AVStorage.Audio.Media.EXTERNAL_DATA_ABILITY_URI 操作媒体元数据,将所有的音频文件标识为AVElement 并存入List
点击ListContainer 的某个item,获取该item 的位置信息,根据位置信息获取到该音乐的AVElement 对象,从而取出媒体资源文件路径,调用onUriSet()设置当前播放音乐的文件路径;取出音乐名称、音乐时长等信息,展示在音乐播放界面。
用户还可以使用播放/ 暂停、上一首、下一首、拖动进度条功能。播放状态监听器PlayerStateListener 中定义了播放成功、暂停、进度条变化、播放完成等回调方法。播放状态改变时,使用handler 发送消息,回调对应方法,代码如下。
(1)播放/ 暂停:初始界面为暂停状态,点击一次该按钮,开始播放音乐;启动定时器,每隔1 s 更新当前播放进度;通过handler 发消息,回调Player-StateListener 的播放成功方法onPlaySuccess(),在该方法中修改按钮图标,设置总时长和进度条的最大值;播放完成后,回调播放完成方法onMusicFinished(),播放下一首。播放过程中,再点击一次该按钮,暂停播放,回调onPauseSuccess()方法,改变该按钮图标为暂停状态。
(2)上一首/ 下一首:点击“上一首”按钮,播放位置减1,如果已经为第一首,则切换到最后一首,获取对应位置的音乐文件路径,调用onUriSet()设置当前播放音乐的文件路径。点击“下一首”按钮,播放位置加1,如果已经为最后一首,则播放第一首。
(3)进度条改变:当进度条位置改变时,调用Player.rewindTo()方法改变播放位置到指定播放进度。
用户点击音乐播放界面的“流转”按钮,系统为用户提供可选择流转的设备信息,如平板或者手机其他设备;并在用户完成设备选择后回调通知应用开始流转,将手机上正在播放的音乐流转到用户选中的设备上。
3.4.1 实现条件
需要流转的两台设备需要满足以下条件,才可以实现流转。
(1)两台设备的wifi 在同一网络。
(2)登录相同的华为账号。
进入手机设置界面,点击“登录华为账号”,输入账号密码后,点击登录或者使用短信验证码登录—登录成功。
(3)开启手机设置中“多设备协同”。
进入手机设置界面,点击打开 “更多连接”—“多设备协同”—选择“开启”。
3.4.2 实现IAbilityContinuation 接口,保存或还原应用程序数据
音乐播放MediaPlayerAbilitySlice 类实现IAbilityContinuation 接口,重写该接口的四个抽象方法,通过接口中提供的方法来保存或还原应用程序数据。
(1)重写方法onStartContinuation()。方法返回true,允许流转。
(2)重写方法onSaveData()。方法返回true,保存迁移后恢复状态必需的数据,主要有:当前播放音乐的文件路径、播放时间、播放状态信息。
(3)重写方法onRestoreData()。方法返回true,将当前播放音乐流转到远程设备时,远程设备可以获取并恢复onSaveData()方法中保存的数据:当前播放的是哪首歌曲、播放状态及播放时长,保持远程设备上播放的音乐和原设备一致,实现无缝流转。以恢复文件路径为例,代码实现如下。
(4)重写方法onCompleteContinuation()。本地迁移完成后回调,调用termiate()方法结束原先设备上的应用程序。
3.4.3 点击“流转”按钮,实现数据迁移
(1)应用向流转任务管理服务注册一个流转回调器。
continuationRegisterManager.register (CONTINUE_BUNDLE,params,callback,requestCallback);params 指定流转的目标设备类型及过滤参数,requestCallback 中获取对应的注册token。
(2)查询可选择设备列表,选取设备后,返回所选设备ID。
通过流转任务管理服务提供的showDeviceList()接口获取可选择设备列表,用户选择设备后在IContinuationDeviceCallback 回调中获取选中设备的设备标识deviceId。
(3)设备连接成功后,更新流转状态。
continuationRegisterManager.updateConnectStatus(abilityToken,deviceId,DeviceConnectState.CONNECTED.getState(),null);
(4)发起迁移请求。
通过continueAbility(deviceId)方法发起迁移请求,调用IAbilityContinuation 接口中提供的方法保存或还原应用程序数据,将主机功能迁移到同一分布式网络上设备标识为deviceId 的设备上。
利用DevEcoStudio 创建两个模拟器,如图2 所示。点击运行箭头,打开两部模拟器。
图2 创建模拟器
打开的两台设备,一个占用18888 端口,另一个占用18889 端口。点击设备名称的下拉菜单列表切换至18889 端口,如图3 所示,分别将应用安装在两台设备上。
图3 切换运行设备
打开应用,首先进入权限窗界面,如图4 所示。选择“始终允许”,进入主界面,显示本地音乐列表,如图5(a)中所示的A 设备界面;点击某一个列表项,进入音乐播放界面,如图5(b)中的B 设备;点击“流转”按钮,将B 设备当前播放音乐流转到A 设备上,流转后的设备界面如图6 所示。
图4 权限窗界面
图5 流转前
图6 流转后
本文基于HarmonyOS 平台,使用分布式技术实现了本地音乐的远程同步,能满足用户根据实际场景,在可信设备间流转本地音乐的使用需求,具有较强的实用价值。