日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
HarmonyOS上視頻跨設(shè)備協(xié)同技術(shù)超全詳解

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

創(chuàng)新互聯(lián)公司是一家專(zhuān)注于成都網(wǎng)站制作、網(wǎng)站建設(shè)與策劃設(shè)計(jì),贛榆網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:贛榆等地區(qū)。贛榆做網(wǎng)站價(jià)格咨詢(xún):18982081108

和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.

1. 介紹

您將會(huì)學(xué)到什么

● 如何使用PageSlider、PageSliderIndicator和ListContainer編寫(xiě)定時(shí)滾動(dòng)及可滑動(dòng)的頁(yè)面。

● 如何使用分布式能力實(shí)現(xiàn)跨設(shè)備視頻播放。

● 如何使用HarmonyOS IDL跨進(jìn)程通信實(shí)現(xiàn)遠(yuǎn)程控制視頻播放。

技能要求

● HarmonyOS Player接口熟練使用

● 基本組件熟練使用

說(shuō)明

本篇Codelab所附代碼適合在真機(jī)運(yùn)行。運(yùn)行時(shí)需要至少兩臺(tái)手機(jī)處于同一個(gè)分布式網(wǎng)絡(luò)中,可以通過(guò)操作如下配置實(shí)現(xiàn):

● 所有手機(jī)接入同一網(wǎng)絡(luò)

● 所有手機(jī)登錄相同華為賬號(hào)

● 所有手機(jī)上開(kāi)啟“設(shè)置->更多連接->多設(shè)備協(xié)同 ”

2. 代碼結(jié)構(gòu)

在鴻蒙上實(shí)現(xiàn)本地和Internet視頻資源播放已對(duì)視頻播放和播放界面代碼結(jié)構(gòu)做了講解,本次Codelab只對(duì)視頻列表頁(yè)、視頻遷移設(shè)備列表、遷移后控制界面及遷移服務(wù)核心代碼做講解,對(duì)于完整代碼,我們會(huì)在參考提供下載方式。代碼結(jié)構(gòu)圖如下:

● provider:該目錄包含CommonProvider、ViewProvider和AdvertisementProvider。CommonProvider是一個(gè)ListContainer 多樣式提供者管理類(lèi)。ViewProvider結(jié)合CommonProvider使用,可以把布局文件中需要賦值的控件單獨(dú)提取出來(lái)進(jìn)行賦值。AdvertisementProvider實(shí)現(xiàn)廣告視頻資源定時(shí)滾動(dòng)的效果。

● ImplVideoMigration.idl:接口中定義了視頻遷入、遷出、根據(jù)控制碼對(duì)視頻進(jìn)行遠(yuǎn)程控制方法。

● data:該目錄包括滾動(dòng)視頻廣告對(duì)象封裝、即將上映視頻對(duì)象封裝以及視頻圖片格式定義。

● VideoMigrateService:供遠(yuǎn)端連接的Service Ability。

● manager:該目錄下的文件為ImplVideoMigration.idl在編譯時(shí)自行生成,初始生成位置為entry\build\generated\source\idl\com\huawei\codelab。

● MediaUtil:對(duì)廣告和視頻列表對(duì)象初始化賦值。

● config.json:配置文件,新增權(quán)限配置如下圖:

1. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允許監(jiān)聽(tīng)分布式組網(wǎng)內(nèi)的設(shè)備狀態(tài)變化。

2. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允許獲取分布式組網(wǎng)內(nèi)的設(shè)備列表和設(shè)備信息。

3. ohos.permission.GET_BUNDLE_INFO:用于查詢(xún)其他應(yīng)用的信息。

4. ohos.permission.DISTRIBUTED_DATASYNC:用于允許不同設(shè)備間的數(shù)據(jù)交換。

5. ohos.permission.INTERNET:用于允許設(shè)備訪問(wèn)網(wǎng)絡(luò)。

3. 創(chuàng)建應(yīng)用程序布局文件

在路徑"resources/base/layout"文件夾下創(chuàng)建video.xml為應(yīng)用主頁(yè)面,展示要播放的視頻列表。

 
 
 
 
  1.                    ohos:width="match_parent" 
  2.                    ohos:height="match_parent" 
  3.                    ohos:orientation="vertical"> 
  4.     
  5.         ohos:height="match_content" 
  6.         ohos:width="match_parent" 
  7.         ohos:orientation="vertical" 
  8.         > 
  9.          
  10.         
  11.             ohos:id="$+id:video_advertisement_container_view" 
  12.             ohos:width="match_parent" 
  13.             ohos:left_margin="20vp" 
  14.             ohos:height="175vp" 
  15.             ohos:top_margin="20vp" 
  16.             ohos:right_margin="12vp" 
  17.             > 
  18.             
  19.                 ohos:id="$+id:video_advertisement_viewpager" 
  20.                 ohos:width="match_parent" 
  21.                 ohos:height="match_parent" 
  22.                 ohos:orientation="horizontal"/> 
  23.   
  24.             
  25.                 ohos:id="$+id:video_advertisement_indicator" 
  26.                 ohos:right_margin="8vp" 
  27.                 ohos:bottom_margin="7vp" 
  28.                 ohos:width="match_content" 
  29.                 ohos:height="match_content" 
  30.                 ohos:align_parent_bottom="true" 
  31.                 ohos:align_parent_right="true" /> 
  32.          
  33.          
  34.         
  35.             ohos:width="match_parent" 
  36.             ohos:height="22vp" 
  37.             ohos:top_margin="12vp" 
  38.             ohos:left_margin="24vp" 
  39.             ohos:right_margin="12vp" 
  40.             ohos:orientation="horizontal"> 
  41.             
  42.                 ohos:id="$+id:video_play_title" 
  43.                 ohos:text="Coming soon" 
  44.                 ohos:text_size="16fp" 
  45.                 ohos:text_color="#ff000000" 
  46.                 ohos:text_alignment="4" 
  47.                 ohos:layout_alignment="vertical_center" 
  48.                 ohos:width="match_content" 
  49.                 ohos:height="match_content" /> 
  50.             
  51.                 ohos:left_margin="6vp" 
  52.                 ohos:width="13vp" 
  53.                 ohos:height="13vp" 
  54.                 ohos:layout_alignment="vertical_center" 
  55.                 ohos:image_src="$media:ic_next"/> 
  56.   
  57.          
  58.          
  59.         
  60.             ohos:width="match_parent" 
  61.             ohos:height="500vp" 
  62.             ohos:orientation="vertical"> 
  63.             
  64.                 ohos:id="$+id:video_list_play_view" 
  65.                 ohos:width="match_parent" 
  66.                 ohos:height="match_content" 
  67.                 ohos:orientation="horizontal" 
  68.                 ohos:left_margin="18vp" 
  69.                 ohos:top_margin="12vp" 
  70.                 > 
  71.              
  72.          
  73.      
  74.   

video.xml采用垂直方向的線性布局方式。整個(gè)頁(yè)面分為三部分的內(nèi)容。從上至下依次是PageSlider滾動(dòng)廣告布局,即將上映視頻圖標(biāo)布局,可左右滑動(dòng)的listContainer布局。

PageSlider是一個(gè)描述滾動(dòng)頁(yè)面的組件,PageSliderIndicator是一個(gè)將滾動(dòng)頁(yè)面組件和其它組件比如圖標(biāo)、按鈕等組合管理的管理器。本應(yīng)用程序展示的滾動(dòng)廣告頁(yè)面采取的是三組廣告圖片和圖片title組成的PageSlider,廣告圖片和圖片title組合樣式由AdvertisementProvider定義。AdvertisementMo初始化代碼如下:

 
 
 
 
  1. public AdvertisementMo(int sourceId, String description) { 
  2.     this.sourceId = sourceId; 
  3.     this.description = description; 
  4. videoAdvertisementMos.add(new AdvertisementMo(ResourceTable.Media_video_advertisement0, "玩心釋放 盡情創(chuàng)想")); 
  5. videoAdvertisementMos.add(new AdvertisementMo(ResourceTable.Media_video_advertisement1, "玩心釋放 盡情創(chuàng)想")); 
  6. videoAdvertisementMos.add(new AdvertisementMo(ResourceTable.Media_video_advertisement2, "一起創(chuàng)造 煥新假期"));

AdvertisementProvider對(duì)滾動(dòng)視頻廣告組件以list形式進(jìn)行封裝。

 
 
 
 
  1. public class AdvertisementProvider extends PageSliderProvider { 
  2.     private List componentList; 
  3.     public AdvertisementProvider(List componentList) { 
  4.         this.componentList = componentList; 
  5.     } 
  6. }

通過(guò)PageSlider對(duì)象的setProvider(CommProvider)方法即可達(dá)到對(duì)圖片列表地滾動(dòng)顯示效果。

 
 
 
 
  1. advertisementProvider = new AdvertisementProvider(getAdvertisementComponents()); 
  2. Component advViewPager = findComponentById(ResourceTable.Id_video_advertisement_viewpager); 
  3. if (advViewPager instanceof PageSlider) { 
  4.     advPageSlider = (PageSlider) advViewPager; 
  5.     advPageSlider.setProvider(advertisementProvider); 
  6. }

getAdertisementCompoents方法將滾動(dòng)視頻廣告添加到list。

 
 
 
 
  1. private List getAdvertisementComponents() { 
  2.     List advertisementMos = MediaUtil.getVideoAdvertisementInfo(); 
  3.     List componentList = new ArrayList<>(advertisementMos.size()); 
  4.     Font.Builder fb = new Font.Builder(VideoTabStyle.BOLD_FONT_NAME); 
  5.     fb.setWeight(Font.BOLD); 
  6.     Font newFont = fb.build(); 
  7.     for (AdvertisementMo advertisementMo : advertisementMos) { 
  8.         Component advRootView = LayoutScatter.getInstance(getContext()).parse( 
  9.                 ResourceTable.Layout_video_advertisement_item, null, false); 
  10.         Image imgTemp = null; 
  11.         if (advRootView.findComponentById(ResourceTable.Id_video_advertisement_poster) instanceof Image) { 
  12.             imgTemp = (Image) advRootView.findComponentById(ResourceTable.Id_video_advertisement_poster); 
  13.         } 
  14.         imgTemp.setPixelMap(advertisementMo.getSourceId()); 
  15.         Text titleTmp = null; 
  16.         if (advRootView.findComponentById(ResourceTable.Id_video_advertisement_title) instanceof Text) { 
  17.             titleTmp = (Text) advRootView.findComponentById(ResourceTable.Id_video_advertisement_title); 
  18.         } 
  19.         titleTmp.setText(advertisementMo.getDescription()); 
  20.         titleTmp.setFont(newFont); 
  21.         componentList.add(advRootView); 
  22.     } 
  23.   
  24.     return componentList; 
  25. }

想要實(shí)現(xiàn)滾動(dòng)到某一特定圖片時(shí)呈現(xiàn)標(biāo)志,在圖片上方加上一組空心圓,當(dāng)滾動(dòng)到第一張圖片時(shí),第一個(gè)圓變?yōu)閷?shí)心,此聯(lián)動(dòng)實(shí)現(xiàn)效果可通過(guò)PageSliderIndicator實(shí)現(xiàn)。

 
 
 
 
  1. PageSliderIndicator advIndicator = null; 
  2. if (findComponentById(ResourceTable.Id_video_advertisement_indicator) instanceof PageSliderIndicator) { 
  3.     advIndicator = (PageSliderIndicator) findComponentById( 
  4.             ResourceTable.Id_video_advertisement_indicator); 
  5. advIndicator.setItemOffset(VideoTabStyle.INDICATOR_OFFSET);

實(shí)心圓效果:

 
 
 
 
  1. ShapeElement normalDrawable = new ShapeElement(); 
  2. normalDrawable.setRgbColor(RgbColor.fromRgbaInt(Color.WHITE.getValue())); 
  3. normalDrawable.setAlpha(VideoTabStyle.INDICATOR_NORMA_ALPHA); 
  4. normalDrawable.setShape(ShapeElement.OVAL); 
  5. normalDrawable.setBounds(0, 0, VideoTabStyle.INDICATOR_BONDS, VideoTabStyle.INDICATOR_BONDS);

空心圓效果:

 
 
 
 
  1. ShapeElement selectedDrawable = new ShapeElement(); 
  2. selectedDrawable.setRgbColor(RgbColor.fromRgbaInt(Color.WHITE.getValue())); 
  3. selectedDrawable.setShape(ShapeElement.OVAL); 
  4. selectedDrawable.setBounds(0, 0, VideoTabStyle.INDICATOR_BONDS, VideoTabStyle.INDICATOR_BONDS);

實(shí)心圓、空心圓效果如下圖:

PageSliderIndicator通過(guò)設(shè)置可選類(lèi)型將會(huì)實(shí)現(xiàn)圖片被選中時(shí),將會(huì)顯示實(shí)心圓。

 
 
 
 
  1. advIndicator.setItemElement(normalDrawable, selectedDrawable); 
  2. advIndicator.setViewPager((PageSlider) advViewPager);

本節(jié)任務(wù)完成的效果如下圖:

視頻播放業(yè)務(wù)本次Codelab不再描述,下面直接進(jìn)入視頻流轉(zhuǎn)環(huán)節(jié)。

4. 視頻跨設(shè)備協(xié)同

HarmonyOS提供了分布式跨設(shè)備能力,本小節(jié)可以實(shí)現(xiàn)將視頻遷移到分布式環(huán)境中的其它設(shè)備上,被遷移設(shè)備可以實(shí)現(xiàn)對(duì)遷移設(shè)備的視頻操作控制。

首先對(duì)視頻播放界面中遷移按鈕增加監(jiān)聽(tīng)事件,在點(diǎn)擊時(shí),從窗口底部滑出分布式設(shè)備列表界面可供選擇遷移。

 
 
 
 
  1. tv = (Image) simplePlayerController.findComponentById(ResourceTable.Id_tv); 
  2. tv.setClickedListener(new Component.ClickedListener() { 
  3.     @Override 
  4.     public void onClick(Component component) { 
  5.         initDevices(); 
  6.         showDeviceList(); 
  7.     } 
  8. });

通過(guò)分布式設(shè)備管理器DeviceManager獲取到當(dāng)前分布式網(wǎng)絡(luò)中可發(fā)現(xiàn)的所有設(shè)備并全部添加到設(shè)備列表。如果設(shè)備列表初始不為空,先將列表清空,再添加,以達(dá)到刷新設(shè)備列表效果。

 
 
 
 
  1. private void initDevices() { 
  2.     if (devices.size() > 0) { 
  3.         devices.clear(); 
  4.     } 
  5.     // 通過(guò)FLAG_GET_ONLINE_DEVICE標(biāo)記獲得在線設(shè)備列表 
  6.     List deviceInfos = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
  7.     devices.addAll(deviceInfos); 
  8. }

顯示設(shè)備列表使用單樣式的內(nèi)容提供器CommonProvider,設(shè)置設(shè)備名字樣式。

 
 
 
 
  1. private void showDeviceList() { 
  2.     CommonProvider commonProvider = new CommonProvider(devices,getContext(), ResourceTable.Layout_device_list_item) { 
  3.         @Override 
  4.         protected void convert(ViewProvider viewProvider, DeviceInfo item, int position) { 
  5.             viewProvider.setText(ResourceTable.Id_device_text, item.getDeviceName()); 
  6.         } 
  7.     }; 
  8.     // 對(duì)deviceListContainer注入commonProvider,完成設(shè)備列表資源樣式設(shè)置 
  9.     deviceListContainer.setItemProvider(commonProvider); 
  10.     // 通知列表數(shù)據(jù)發(fā)生變化更新設(shè)備列表 
  11.     commonProvider.notifyDataChanged(); 
  12.     transWindow.show(); 
  13. }

創(chuàng)建設(shè)備列表顯示組件SlidePopupWindow。設(shè)備列表是一個(gè)從底部滑出的一個(gè)窗口,屬于自定義組件。核心功能是設(shè)備列表的顯示與隱藏。

 
 
 
 
  1. public void show() { 
  2.     if (!isShow) { 
  3.         isShow = true; 
  4.         animatorProperty 
  5.                 .moveFromX(startX) 
  6.                 .moveToX(endX) 
  7.                 .moveFromY(startY) 
  8.                 .moveToY(endY) 
  9.                 .setCurveType(Animator.CurveType.LINEAR) 
  10.                 .setDuration(ANIM_DURATION) 
  11.                 .start(); 
  12.     } 
  13.   
  14. public void hide() { 
  15.     if (isShow) { 
  16.         isShow = false; 
  17.         animatorProperty 
  18.                 .moveFromX(endX) 
  19.                 .moveToX(startX) 
  20.                 .moveFromY(endY) 
  21.                 .moveToY(startY) 
  22.                 .setCurveType(Animator.CurveType.LINEAR) 
  23.                 .setDuration(ANIM_DURATION) 
  24.                 .start(); 
  25.     } 
  26. }

設(shè)備列表效果如下圖:

點(diǎn)擊列表中某一個(gè)設(shè)備,將在已選設(shè)備端拉起該視頻應(yīng)用。

 
 
 
 
  1. deviceListContainer.setItemClickedListener(new ListContainer.ItemClickedListener() { 
  2.     @Override 
  3.     public void onItemClicked(ListContainer listContainer, Component component, int num, long l) { 
  4.         // 列表窗口隱藏 
  5.         transWindow.hide(); 
  6.         startAbilityFa(devices.get(num).getDeviceId()); 
  7.     } 
  8. });

通過(guò)startAbilityFa()跨設(shè)備拉起視頻FA,再調(diào)用connectAbility()異步對(duì)遠(yuǎn)端服務(wù)連接,成功連接后,在回調(diào)onAbilityConnectDone中服務(wù)端恢復(fù)視頻數(shù)據(jù)。

 
 
 
 
  1. private void startAbilityFa(String devicesId) { 
  2.     Intent intent = new Intent(); 
  3.     Operation operation = 
  4.             new Intent.OperationBuilder() 
  5.                     .withDeviceId(devicesId) 
  6.                     .withBundleName(getBundleName()) 
  7.                     .withAbilityName(VideoMigrateService.class.getName()) 
  8.                     .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) 
  9.                     .build();// 開(kāi)發(fā)者需要在Intent中設(shè)置支持分布式的標(biāo)記FLAG_ABILITYSLICE_MULTI_DEVICE,否則無(wú)法獲得分布式能力 
  10.     intent.setOperation(operation); 
  11.     boolean connectFlag = connectAbility(intent, 
  12.                     new IAbilityConnection() { 
  13.                         @Override 
  14.                         public void onAbilityConnectDone( 
  15.                                 ElementName elementName, IRemoteObject remoteObject, int i) { 
  16.                             // asInterface的作用是根據(jù)調(diào)用的服務(wù)是否屬于同進(jìn)程而返回不同的實(shí)例對(duì)象 
  17.                             implVideoMigration = VideoMigrationStub.asInterface(remoteObject); 
  18.                             try { 
  19.                                 implVideoMigration.flyIn(startMillisecond); 
  20.                             } catch (RemoteException e) { 
  21.                                 LogUtil.error(TAG, "connect successful,but have remote exception"); 
  22.                             } 
  23.                         } 
  24.   
  25.                         @Override 
  26.                         public void onAbilityDisconnectDone(ElementName elementName, int i) { 
  27.                             disconnectAbility(this); 
  28.                         } 
  29.                     }); 
  30.     if (connectFlag) { 
  31.         Toast.toast(this, "migrate successful!", TOAST_DURATION); 
  32.         remoteController.show(); 
  33.         startMillisecond = implPlayer.getAudioCurrentPosition();// 獲取視頻當(dāng)前播放進(jìn)度 
  34.         implPlayer.release();// 釋放資源 
  35.     } else { 
  36.         Toast.toast(this, "migrate failed!Please try again later.", TOAST_DURATION); 
  37.     } 
  38. }

通過(guò)指定abilityName為VideoMigrateService,執(zhí)行VideoMigrateService中onConnect(intent)方法,返回binder對(duì)象,回調(diào)onAbilityConnectDone拿到具體的binder對(duì)象。VideoMigrationStub.asInterface(remoteObject)根據(jù)調(diào)用是否屬于同進(jìn)程而返回不同的實(shí)例對(duì)象, 由于返回的binder不是本進(jìn)程的,所以返回的是VideoMigrationProxy對(duì)象。

接下來(lái)我們分別把本端設(shè)備稱(chēng)為設(shè)備A,跨設(shè)備協(xié)同端稱(chēng)為設(shè)備B。 implVideoMigration.flyIn(startMillisecond)由設(shè)備A即VideoMigrationProxy執(zhí)行,通過(guò)sendRequest發(fā)送到設(shè)備B。

 
 
 
 
  1. remote.sendRequest(COMMAND_FLY_IN, data, reply, option);

設(shè)備B通過(guò)接收到的code類(lèi)型為COMMAND_FLY_IN在服務(wù)端執(zhí)行視頻數(shù)據(jù)恢復(fù)。

 
 
 
 
  1. @Override 
  2. public void flyIn(int startTimemiles) throws RemoteException { 
  3.     Intent intent = new Intent(); 
  4.     Operation operation = 
  5.             new Intent.OperationBuilder() 
  6.                     .withBundleName(getBundleName()) 
  7.                     .withAbilityName(MainAbility.class.getName()) 
  8.                     .withAction("action.video.play") 
  9.                     .build(); 
  10.     intent.setOperation(operation); 
  11.     intent.setParam(Constants.INTENT_STARTTIME_PARAM, startTimemiles); 
  12.     startAbility(intent); 
  13. }

設(shè)備B呈現(xiàn)播放界面并跳轉(zhuǎn)到Intent中攜帶的播放位置。在設(shè)備A的視頻應(yīng)用跨設(shè)備協(xié)同到設(shè)備B時(shí),設(shè)備A會(huì)釋放掉視頻資源并展示RemoteController。

 
 
 
 
  1. if (connectFlag) { 
  2.     Toast.toast(this, "migrate successful!", TOAST_DURATION); 
  3.     remoteController.show();// 控制界面出現(xiàn) 
  4.     startMillisecond = implPlayer.getAudioCurrentPosition(); 
  5.     implPlayer.release(); 
  6. }

設(shè)備A的RemoteController在創(chuàng)建時(shí)初始化界面布局。通過(guò)操作界面控件來(lái)控制設(shè)備B視頻播放。例如點(diǎn)擊前進(jìn)按鈕,RemoteController發(fā)送FORWARD 控制碼。SimplePlayerAbilitySlice通過(guò)添加RemoteController.RemoteControllerListener來(lái)執(zhí)行回調(diào)方法sendControl,再通過(guò)implVideoMigration代理對(duì)象與對(duì)端進(jìn)行通信。

 
 
 
 
  1. remoteController.setRemoteControllerCallback(new RemoteController.RemoteControllerListener() { 
  2. @Override 
  3.     public void sendControl(int code, int extra) { 
  4.     try { 
  5.         if (implVideoMigration != null) { 
  6.             // 調(diào)用設(shè)備A服務(wù)代理對(duì)象的playControl方法通過(guò)binder對(duì)象調(diào)用設(shè)備B服務(wù)端的playControl方法 
  7.             implVideoMigration.playControl(code, extra); 
  8.         } 
  9.     } catch (RemoteException e) { 
  10.         LogUtil.error(TAG, "RemoteException occurs "); 
  11.     } 
  12.   } 
  13. });

設(shè)備A效果如下圖:

設(shè)備B效果如下圖:

當(dāng)設(shè)備A在RemoteController界面執(zhí)行返回操作時(shí),會(huì)隱藏RemoteController,同時(shí)設(shè)備A繼續(xù)播放。

 
 
 
 
  1. public void hide() { 
  2.     if (isShown) { 
  3.         isShown = false; 
  4.         setVisibility(INVISIBLE); 
  5.         if (remoteControllerListener != null) { 
  6.             remoteControllerListener.controllerDismiss(); 
  7.         } 
  8.     } 
  9. remoteController.setRemoteControllerCallback(new RemoteController.RemoteControllerListener() { 
  10. @Override 
  11. public void controllerDismiss() { 
  12.     int progress = 0; 
  13.     try { 
  14.         if (implVideoMigration!= null) { 
  15.             // 遷回視頻時(shí)獲取進(jìn)度條進(jìn)度 
  16.             progress = implVideoMigration.flyOut(); 
  17.         } 
  18.     } catch (RemoteException e) { 
  19.         LogUtil.e(TAG, "RemoteException occurs"); 
  20.     } 
  21.     // 設(shè)備A視頻按照遷回的視頻進(jìn)度繼續(xù)播放 
  22.     implPlayer.reload(url, progress); 
  23. });

說(shuō)明

以上代碼僅demo演示參考使用,產(chǎn)品化的代碼需要使用國(guó)際化。

5. 恭喜你

● 通過(guò)使用PageSlider、PageSliderIndicator結(jié)合ListContainer編寫(xiě)定時(shí)滾動(dòng)及可滑動(dòng)的頁(yè)面。

● HarmonyOS通過(guò)DeviceManger獲取分布式網(wǎng)絡(luò)中設(shè)備列表,選中設(shè)備ID之后,再通過(guò)IDL跨進(jìn)程通信方式將FA或PA攜帶數(shù)據(jù)跨設(shè)備拉起。

● 整體運(yùn)行效果圖如下:

設(shè)備A視頻跨設(shè)備協(xié)同后效果圖如下:

至此,您已經(jīng)完成HarmonyOS上視頻跨設(shè)備協(xié)同的體驗(yàn)!

6. 參考

gitee源碼

github源碼

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.


當(dāng)前名稱(chēng):HarmonyOS上視頻跨設(shè)備協(xié)同技術(shù)超全詳解
網(wǎng)頁(yè)網(wǎng)址:http://www.dlmjj.cn/article/cogpjhj.html