劉丹,董明華,劉正
(1.江蘇聯(lián)合職業(yè)技術(shù)學院蘇州工業(yè)園區(qū)分院,江蘇 蘇州 215123;2.蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)技術(shù)學院,江蘇 蘇州 215123)
近年來,在5G、AIoT 技術(shù)的推動下,我國智能電視、智能音箱、智能車載、智能耳機等智能終端行業(yè)發(fā)展迅速,智能終端上的用戶對音樂服務(wù)的需求增長非???。用戶在聽音樂時,當使用情境發(fā)生變化時,之前使用的設(shè)備可能不適合繼續(xù)當前的任務(wù),此時,用戶可以選擇一鍵將音樂流轉(zhuǎn)到智慧屏、平板、手表、音箱等鴻蒙設(shè)備,使用新的設(shè)備來繼續(xù)播放音樂,音樂播放的無縫流轉(zhuǎn)給用戶帶來流暢完整的沉浸式體驗[1]。
本文利用鴻蒙系統(tǒng)的分布式能力,實現(xiàn)了音樂服務(wù)的跨設(shè)備流轉(zhuǎn),主要功能包括:本地音樂列表展示、音樂播放/ 暫停、上一首、下一首和同步音樂到可信設(shè)備。系統(tǒng)界面簡潔、易用,用戶可以方便地完成音樂播放器在不同設(shè)備間的流轉(zhuǎn)。
華為鴻蒙系統(tǒng)(HarmonyOS)是一款全新的面向全場景的開源分布式操作系統(tǒng),為不同設(shè)備的互聯(lián)與協(xié)同提供了統(tǒng)一的平臺[2],具有分布式架構(gòu)Kit 提供屏幕布局控件及交互的自動適配功能,使開發(fā)者可以基于同一工程高效構(gòu)建多端自動運行的APP,實現(xiàn)跨設(shè)備之間的生態(tài)共享[3]。
華為鴻蒙系統(tǒng)采用了支持高性能多語言編譯的方舟編譯器,能夠完成聯(lián)合優(yōu)化,提高代碼執(zhí)行效率,性能上不弱于安卓系統(tǒng)[4]。由于鴻蒙系統(tǒng)微內(nèi)核的代碼量只有Linux 宏內(nèi)核的千分之一,其受攻擊概率也大幅降低[5]。鴻蒙系統(tǒng)也因此成為史上發(fā)展最快的智能終端操作系統(tǒng)。
鴻蒙的分布式能力是其最大的特點,可以讓更多設(shè)備組合實現(xiàn)超級終端體驗。HarmonyOS 的分布式能力眾多,包括分布式軟總線、分布式任務(wù)調(diào)度和分布式數(shù)據(jù)管理等。分布式任務(wù)調(diào)度讓應(yīng)用開發(fā)者可以聚焦在業(yè)務(wù)實現(xiàn)上,很方便地開發(fā)HarmonyOS 上的分布式應(yīng)用。
流轉(zhuǎn)在HarmonyOS 中泛指多設(shè)備分布式操作,即一個應(yīng)用程序在某一個設(shè)備上運行,用戶切換到另外一個設(shè)備上繼續(xù)運行,同時停止在原來設(shè)備上的運行。流轉(zhuǎn)能力打破了設(shè)備界限,多設(shè)備聯(lián)動,使用戶應(yīng)用程序可分可合、可流轉(zhuǎn)[6]。本文使用的是跨端遷移流轉(zhuǎn),即在A 端運行的應(yīng)用程序FA 遷移到B 端上,完成遷移后,F(xiàn)A 在B 端繼續(xù)執(zhí)行,而在A 端退出應(yīng)用[7]。
用戶打開APP,提醒用戶是否授予讀取存儲權(quán)限和多設(shè)備協(xié)同訪問權(quán)限。用戶允許后,進入主頁,展示本地音樂列表。點擊其中的任一首音樂,進入音樂播放界面,展示歌曲名、播放時長等信息,以及“上一首”“下一首”“播放/ 暫停”“流轉(zhuǎn)”等按鈕。點擊“播放/ 暫?!卑粹o,實現(xiàn)播放/ 暫停;點擊“流轉(zhuǎn)”按鈕,獲取信任的設(shè)備列表,用戶選擇需要流轉(zhuǎn)的設(shè)備,將當前播放的音樂流轉(zhuǎn)到選中的設(shè)備上。系統(tǒng)包括以下三個模塊:本地音樂列表展示、音樂播放、音樂流轉(zhuǎn),功能模塊圖如圖1 所示。
各模塊具體功能如下:
(1)本地音樂列表展示:讀取本地音樂文件,以列表形式展示。
(2)音樂播放:音樂播放界面展示歌曲名、播放時長和播放狀態(tài)信息。通過界面按鈕,實現(xiàn)上一首、下一首、音樂播放、暫停和進度控制。
(3)音樂流轉(zhuǎn):點擊“流轉(zhuǎn)”按鈕,彈出查找可信任設(shè)備對話框,展示設(shè)備查找結(jié)果,選中需要流轉(zhuǎn)的設(shè)備,同步音樂到該設(shè)備,同步信息包括:音樂文件路徑、音樂時長和音樂播放狀態(tài)等。
音樂播放器的主要流程為:打開應(yīng)用,提示是否授予APP 訪問設(shè)備上的媒體和使用多設(shè)備協(xié)同的權(quán)限;選擇“始終允許”,進入主界面,顯示本地音樂列表,點擊某一個列表項,進入音樂播放界面。在音樂播放界面可以實現(xiàn)播放/ 暫停音樂,播放上一首、下一首音樂,或者切換播放進度等功能。點擊“流轉(zhuǎn)”按鈕,選擇需要流轉(zhuǎn)的設(shè)備,將當前播放音樂流轉(zhuǎn)到新設(shè)備上,保持遠程設(shè)備上播放的音樂和原設(shè)備播放的音樂播放狀態(tài)、播放時長等一致,實現(xiàn)無縫流轉(zhuǎn)。
本系統(tǒng)需要申請的權(quán)限有:本地多媒體訪問、多設(shè)備協(xié)同訪問權(quán)限。具體步驟如下。
3.1.1 靜態(tài)權(quán)限配置
在config.json 中的“reqPermissions”字段中聲明所需要的權(quán)限,該字段對應(yīng)的value 值是一個數(shù)組,里面可以有多個對象,每個對象描述了一個權(quán)限。
以上代碼,分別申請了讀取存儲權(quán)限、多設(shè)備協(xié)同訪問權(quán)限。
3.1.2 動態(tài)權(quán)限配置
使用ohos.app.Context.verifySelfPermission()接口查詢應(yīng)用是否已被授予權(quán)限,如果未被授予權(quán)限,使用canRequestPermission()查詢是否可動態(tài)申請權(quán)限,再使用requestPermissionsFromUser()動態(tài)申請多個權(quán)限。
3.1.3 權(quán)限申請成功回調(diào)
APP 在使用危險權(quán)限時,需要用戶授權(quán)后,才可進一步操作。重寫ohos.aafwk.ability.Ability 的回調(diào)函數(shù)onRequestPermissionsFromUserResult()接收授予結(jié)果。讀取存儲權(quán)限申請成功后,調(diào)用MainAbilitySlice 類自定義的initListContainer()方法,依據(jù)讀取到的音樂信息,設(shè)置ListContainer 數(shù)據(jù)源。
鴻蒙操作系統(tǒng)提供了可復用列表項的列表組件ListContainer,使用媒體外部存儲提供的文件路徑AVStorage.Audio.Media.EXTERNAL_DATA_ABILITY_URI 操作媒體元數(shù)據(jù),將所有的音頻文件標識為AVElement 并存入List
點擊ListContainer 的某個item,獲取該item 的位置信息,根據(jù)位置信息獲取到該音樂的AVElement 對象,從而取出媒體資源文件路徑,調(diào)用onUriSet()設(shè)置當前播放音樂的文件路徑;取出音樂名稱、音樂時長等信息,展示在音樂播放界面。
用戶還可以使用播放/ 暫停、上一首、下一首、拖動進度條功能。播放狀態(tài)監(jiān)聽器PlayerStateListener 中定義了播放成功、暫停、進度條變化、播放完成等回調(diào)方法。播放狀態(tài)改變時,使用handler 發(fā)送消息,回調(diào)對應(yīng)方法,代碼如下。
(1)播放/ 暫停:初始界面為暫停狀態(tài),點擊一次該按鈕,開始播放音樂;啟動定時器,每隔1 s 更新當前播放進度;通過handler 發(fā)消息,回調(diào)Player-StateListener 的播放成功方法onPlaySuccess(),在該方法中修改按鈕圖標,設(shè)置總時長和進度條的最大值;播放完成后,回調(diào)播放完成方法onMusicFinished(),播放下一首。播放過程中,再點擊一次該按鈕,暫停播放,回調(diào)onPauseSuccess()方法,改變該按鈕圖標為暫停狀態(tài)。
(2)上一首/ 下一首:點擊“上一首”按鈕,播放位置減1,如果已經(jīng)為第一首,則切換到最后一首,獲取對應(yīng)位置的音樂文件路徑,調(diào)用onUriSet()設(shè)置當前播放音樂的文件路徑。點擊“下一首”按鈕,播放位置加1,如果已經(jīng)為最后一首,則播放第一首。
(3)進度條改變:當進度條位置改變時,調(diào)用Player.rewindTo()方法改變播放位置到指定播放進度。
用戶點擊音樂播放界面的“流轉(zhuǎn)”按鈕,系統(tǒng)為用戶提供可選擇流轉(zhuǎn)的設(shè)備信息,如平板或者手機其他設(shè)備;并在用戶完成設(shè)備選擇后回調(diào)通知應(yīng)用開始流轉(zhuǎn),將手機上正在播放的音樂流轉(zhuǎn)到用戶選中的設(shè)備上。
3.4.1 實現(xiàn)條件
需要流轉(zhuǎn)的兩臺設(shè)備需要滿足以下條件,才可以實現(xiàn)流轉(zhuǎn)。
(1)兩臺設(shè)備的wifi 在同一網(wǎng)絡(luò)。
(2)登錄相同的華為賬號。
進入手機設(shè)置界面,點擊“登錄華為賬號”,輸入賬號密碼后,點擊登錄或者使用短信驗證碼登錄—登錄成功。
(3)開啟手機設(shè)置中“多設(shè)備協(xié)同”。
進入手機設(shè)置界面,點擊打開 “更多連接”—“多設(shè)備協(xié)同”—選擇“開啟”。
3.4.2 實現(xiàn)IAbilityContinuation 接口,保存或還原應(yīng)用程序數(shù)據(jù)
音樂播放MediaPlayerAbilitySlice 類實現(xiàn)IAbilityContinuation 接口,重寫該接口的四個抽象方法,通過接口中提供的方法來保存或還原應(yīng)用程序數(shù)據(jù)。
(1)重寫方法onStartContinuation()。方法返回true,允許流轉(zhuǎn)。
(2)重寫方法onSaveData()。方法返回true,保存遷移后恢復狀態(tài)必需的數(shù)據(jù),主要有:當前播放音樂的文件路徑、播放時間、播放狀態(tài)信息。
(3)重寫方法onRestoreData()。方法返回true,將當前播放音樂流轉(zhuǎn)到遠程設(shè)備時,遠程設(shè)備可以獲取并恢復onSaveData()方法中保存的數(shù)據(jù):當前播放的是哪首歌曲、播放狀態(tài)及播放時長,保持遠程設(shè)備上播放的音樂和原設(shè)備一致,實現(xiàn)無縫流轉(zhuǎn)。以恢復文件路徑為例,代碼實現(xiàn)如下。
(4)重寫方法onCompleteContinuation()。本地遷移完成后回調(diào),調(diào)用termiate()方法結(jié)束原先設(shè)備上的應(yīng)用程序。
3.4.3 點擊“流轉(zhuǎn)”按鈕,實現(xiàn)數(shù)據(jù)遷移
(1)應(yīng)用向流轉(zhuǎn)任務(wù)管理服務(wù)注冊一個流轉(zhuǎn)回調(diào)器。
continuationRegisterManager.register (CONTINUE_BUNDLE,params,callback,requestCallback);params 指定流轉(zhuǎn)的目標設(shè)備類型及過濾參數(shù),requestCallback 中獲取對應(yīng)的注冊token。
(2)查詢可選擇設(shè)備列表,選取設(shè)備后,返回所選設(shè)備ID。
通過流轉(zhuǎn)任務(wù)管理服務(wù)提供的showDeviceList()接口獲取可選擇設(shè)備列表,用戶選擇設(shè)備后在IContinuationDeviceCallback 回調(diào)中獲取選中設(shè)備的設(shè)備標識deviceId。
(3)設(shè)備連接成功后,更新流轉(zhuǎn)狀態(tài)。
continuationRegisterManager.updateConnectStatus(abilityToken,deviceId,DeviceConnectState.CONNECTED.getState(),null);
(4)發(fā)起遷移請求。
通過continueAbility(deviceId)方法發(fā)起遷移請求,調(diào)用IAbilityContinuation 接口中提供的方法保存或還原應(yīng)用程序數(shù)據(jù),將主機功能遷移到同一分布式網(wǎng)絡(luò)上設(shè)備標識為deviceId 的設(shè)備上。
利用DevEcoStudio 創(chuàng)建兩個模擬器,如圖2 所示。點擊運行箭頭,打開兩部模擬器。
圖2 創(chuàng)建模擬器
打開的兩臺設(shè)備,一個占用18888 端口,另一個占用18889 端口。點擊設(shè)備名稱的下拉菜單列表切換至18889 端口,如圖3 所示,分別將應(yīng)用安裝在兩臺設(shè)備上。
圖3 切換運行設(shè)備
打開應(yīng)用,首先進入權(quán)限窗界面,如圖4 所示。選擇“始終允許”,進入主界面,顯示本地音樂列表,如圖5(a)中所示的A 設(shè)備界面;點擊某一個列表項,進入音樂播放界面,如圖5(b)中的B 設(shè)備;點擊“流轉(zhuǎn)”按鈕,將B 設(shè)備當前播放音樂流轉(zhuǎn)到A 設(shè)備上,流轉(zhuǎn)后的設(shè)備界面如圖6 所示。
圖4 權(quán)限窗界面
圖5 流轉(zhuǎn)前
圖6 流轉(zhuǎn)后
本文基于HarmonyOS 平臺,使用分布式技術(shù)實現(xiàn)了本地音樂的遠程同步,能滿足用戶根據(jù)實際場景,在可信設(shè)備間流轉(zhuǎn)本地音樂的使用需求,具有較強的實用價值。