在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙版JS如何實現(xiàn)分布式仿抖音應用

OpenHarmony技術社區(qū) ? 來源:鴻蒙技術社區(qū) ? 作者:陳建朋 ? 2021-11-15 09:44 ? 次閱讀

之前大家看過了 Java 版的《HarmonyOS 分布式之仿抖音應用》,現(xiàn)在講講 JS 如何實現(xiàn)分布式仿抖音應用,通過 JS 方式開發(fā)視頻播放,分布式設備遷移,評論,通過 Java 和 JS 交互,獲取設備信息,選擇設備信息做分布式遷移。

功能:分布式遷移到不同設備,視頻進行評論,播放視頻,可以像抖音一樣切換視頻,可以點贊,分享等操作。

開發(fā)版本:sdk6,DevEco Studio3.0 Beta1。

主要代碼

①視頻播放

鴻蒙 js 中有專門【video】的組件,并且非常完善,可以直接使用:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-media-video-0000000000611764

<videoid='playerId{{$idx}}'src='{{$item.path}}'muted='false'autoplay='true'
controls="false"onprepared='preparedCallback'onstart='startCallback'onpause='pauseCallback'
onfinish='finishCallback'onerror='errorCallback'onseeking='seekingCallback'
onseeked='seekedCallback'
ontimeupdate='timeupdateCallback'style="object-fit:contain;width:100%;"
onlongpress='change_fullscreenchange'onclick="change_start_pause"loop='true'
starttime="0"
>
video>

js 代碼中視頻資源:

list:[{
path:"/common/video/video1.mp4"
},{
path:"/common/video/video2.mp4"
},{
path:"/common/video/video3.mp4"
},{
path:"/common/video/video4.mp4"
},{
path:"/common/video/video5.mp4"
},{
path:"/common/video/video6.mp4"
}]
②仿抖音視頻切換

有關視頻切換的開發(fā) js 中也提供了對應的組件【swiper】,可以直接使用來進行視頻切換:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-container-swiper-0000000000611533



<swiperclass="swiper-content"id="swiper"index="{{player_index}}"
indicator="false"loop="true"digital="false"vertical="true"onchange="changeVideo">
<stackclass="stack-parent"for="list">
<divclass="videosource">

<videoid='playerId{{$idx}}'src='{{$item.path}}'muted='false'autoplay='true'
controls="false"onprepared='preparedCallback'onstart='startCallback'onpause='pauseCallback'
onfinish='finishCallback'onerror='errorCallback'onseeking='seekingCallback'
onseeked='seekedCallback'
ontimeupdate='timeupdateCallback'style="object-fit:contain;width:100%;"
onlongpress='change_fullscreenchange'onclick="change_start_pause"loop='true'
starttime="0"
>
video>
div>
stack>
swiper>

③評論功能添加

評論功能使用了鴻蒙 js 中了兩個組件【list】(負責列表展示) 和【input】(負責信息發(fā)送),可參見有關文檔。
https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-container-list-0000000000611496

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-basic-input-0000000000611673

評論功能有兩部分,評論列表和評論發(fā)送輸入框。

<divclass="pinglun"style="visibility:{{ifhidden}};">
<divstyle="height:32%;background-color:transparent;"onclick="hideenbg">
<text>text>
div>

<listclass="todo-wrapper"divider="true"style="divider-color:darkgrey;">

<list-itemfor="{{todolist}}"class="todo-item">
<divclass="photo">
<imageclass="image-set"src="/common/images/science6.png">image>
<textclass="todo-title"style="font-size:14fp;margin-left:10px;">{{$item.name}}
text>
div>
<textclass="todo-title"style="font-size:14fp;margin-top:5px;">{{$item.detail}}text>
list-item>
list>

<divclass="butt">

<inputid="input"class="input"type="text"value="{{content}}"maxlength="20"enterkeytype="send"
placeholder="{{placecontent}}"onchange="change"
onenterkeyclick="enterkeyClick">
input>
<buttonclass="last"onclick="sendmessage">發(fā)送button>
div>
div>

功能實現(xiàn)邏輯:

change(e){//監(jiān)聽輸入框信息變化獲取信息
this.message=e.value;
console.log("message==="+this.message)
},

sendmessage(){//提交信息后組織數(shù)據(jù)刷新界面
this.todolist.push({
name:'王者',
detail:this.message,
})
this.content="";
this.message="";
},
④JS 和 Java 交互獲取設備信息 在實現(xiàn)分布式設備遷移的時候查找 js 沒有找到獲取設備信息的有關接口,所以考慮通過 js 和 Java 相互調(diào)用實現(xiàn)。通過 jsFA 調(diào)用 Java PA機制,實現(xiàn)數(shù)據(jù)的獲取和傳遞。 js 端實現(xiàn)如下:

重點:
  • Ability 類型,對應 PA 端不同的實現(xiàn)方式:0:Ability,1:Internal Ability。

  • syncOption PA 側(cè)請求消息處理同步/異步選項:0:同步方式,默認方式,1:異步方式。
initAction(code){
varactionData={};
actionData.firstNum=1024;
actionData.secondNum=2048;
varaction={};
action.bundleName="com.corecode.video.videoplayer";//包名
action.abilityName="com.corecode.video.videoplayer.DeviceInternalAbility";//包名+類名
action.messageCode=code;//消息編碼
action.data=actionData;//傳遞數(shù)據(jù)
action.abilityType=1;//ability類型
action.syncOption=1;//同步還是異步類型
returnaction;
},
getLevel:asyncfunction(){
try{
varaction=this.initAction(1001);
varresult=awaitFeatureAbility.callAbility(action);
console.info("result="+result);
this.deviceId=JSON.parse(JSON.parse(result).result);
console.log("deviceId=="+this.deviceId)
this.devicelist="visible";
}catch(pluginError){
console.error("getBatteryLevel:PluginError="+pluginError);
}
}

Java 端實現(xiàn)如下:

Java 端需要創(chuàng)建一個 ability 服務繼承 AceInternalAbility 具體是使用哪種類型,看上面的解釋。

創(chuàng)建后需要注冊,比如我創(chuàng)建的是 InternalAbility 這樣注冊:DeviceInternalAbility.register(this);

packagecom.corecode.video.videoplayer;
publicclassDeviceInternalAbilityextendsAceInternalAbility{
privatestaticfinalHiLogLabelTAG=newHiLogLabel(0,0,"DeviceInternalAbility");
privatestaticfinalintCONNECT_ABILITY=2000;
privatestaticfinalintDISCONNECT_ABILITY=2001;
privatestaticfinalintSEND_MSG=1001;
privatestaticfinalintSUCCESS_CODE=0;
privatestaticfinalintFAIL_CODE=-1;
privatestaticDeviceInternalAbilityINSTANCE;
privateStringselectDeviceId;

/**
*defaultconstructor
*
*@paramcontextabilitycontext
*/
publicDeviceInternalAbility(AbilityContextcontext){
super("com.corecode.video.videoplayer","com.corecode.video.videoplayer.DeviceInternalAbility");
}

publicDeviceInternalAbility(StringbundleName,StringabilityName){
super(bundleName,abilityName);
}

publicDeviceInternalAbility(StringabilityName){
super(abilityName);
}

/**
*setInternalAbilityHandlerforDistributeInternalAbilityinstance
*
*@paramcontextabilitycontext
*/
staticvoidregister(AbilityContextcontext){
INSTANCE=newDeviceInternalAbility(context);
INSTANCE.setInternalAbilityHandler((code,data,reply,option)->
INSTANCE.onRemoteRequest(code,data,reply,option));
}

/**
*destroyDistributeInternalAbilityinstance
*/
privatestaticvoidunregister(){
INSTANCE.destroy();
}

/**
*defaultdestructor
*/
privatevoiddestroy(){
}

/**
*handclickrequestfromjavascript
*
*@paramcodeACTION_CODE
*@paramdatadatasentfromjavascript
*@paramreplyreplyforjavascript
*@paramoptioncurrentlyexcessive
*@returnwhetherjavascriptclickeventiscorrectlyresponded
*/
privatebooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption){
MapreplyResult=newHashMap<>();
switch(code){
//sendmessagetoremotedevice,messagecontainscontrollercommandfromFA
caseSEND_MSG:{
ZSONObjectdataParsed=ZSONObject.stringToZSON(data.readString());
intmessage=dataParsed.getIntValue("message");
////SYNC
//if(option.getFlags()==MessageOption.TF_SYNC){
//reply.writeString(ZSONObject.toZSONString(result));
//}
//ASYNC
//返回結(jié)果當前僅支持String,對于復雜結(jié)構(gòu)可以序列化為ZSON字符串上報
Mapresult=newHashMap();
result.put("result",MainAbility.getList());
MessageParcelresponseData=MessageParcel.obtain();
responseData.writeString(ZSONObject.toZSONString(result));
IRemoteObjectremoteReply=reply.readRemoteObject();
try{
remoteReply.sendRequest(0,responseData,MessageParcel.obtain(),newMessageOption());
}catch(RemoteExceptionexception){
returnfalse;
}finally{
responseData.reclaim();
}
break;
}
//toinvokeremotedevice'snewsShareabilityandsendnewsurlwetransfer
caseCONNECT_ABILITY:{
ZSONObjectdataParsed=ZSONObject.stringToZSON(data.readString());
selectDeviceId=dataParsed.getString("deviceId");
break;
}
//whencontrollerFAwenttodestroylifeCycle,disconnectwithremotenewsShareability
caseDISCONNECT_ABILITY:{
unregister();
break;
}
default:
HiLog.error(TAG,"messageCodenothandleproperlyinphonedistributeInternalAbility");
}
returntrue;
}

privatevoidassembleReplyResult(intcode,MapreplyResult,Objectcontent,MessageParcelreply){
replyResult.put("code",code);
replyResult.put("content",content);
reply.writeString(ZSONObject.toZSONString(replyResult));
}
}

js 調(diào)用后會進入 Java 的 onRemoteRequest 函數(shù)進行數(shù)據(jù)解析和組織,然后通過如下接口將需要的結(jié)果回傳給 js 做界面展示和操作。

remoteReply.sendRequest(0,responseData,MessageParcel.obtain(),newMessageOption());

獲取設備信息:

List<DeviceInfo>deviceInfos=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);

⑤分布式遷移

鴻蒙中分布式遷移真的是做到了強大,在 js 中只需要四個函數(shù)就能完成分布式遷移。

onSaveData(saveData){//數(shù)據(jù)保存到savedData中進行遷移。
vardata={
list:this.list,
player_index:this.player_index,
};
Object.assign(saveData,data)
},
onRestoreData(restoreData){//收到遷移數(shù)據(jù),恢復。
console.info('====onRestoreData'+JSON.stringify(restoreData))
this.list=restoreData.list
this.player_index=restoreData.player_index

this.$element('swiper').swipeTo({
index:this.player_index
});

},
onCompleteContinuation(code){//遷移完成
console.log("onCompleteContinuation==="+code)
},
onStartContinuation(){//遷移開始
returntrue;
},

遷移:上面的四個有關函數(shù)設置好后執(zhí)行下面的接口就能實現(xiàn)分布式遷移了。

continueVideoAbility:asyncfunction(){
letconti=awaitFeatureAbility.continueAbility();
}
⑥權(quán)限

需要加上需要的權(quán)限:

"reqPermissions":[
{
"reason":"",
"usedScene":{
"ability":[
"MainAbility"
],
"when":"inuse"
},
"name":"ohos.permission.DISTRIBUTED_DATASYNC"
},
{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
},
{
"name":"ohos.permission.GRT_BUNDLE_INFO"
},
{
"name":"ohos.permission.INTERNET"
}
]

源碼地址【 分布式仿抖音視頻】:

https://gitee.com/dot_happydz_admin/video-player

責任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 應用
    +關注

    關注

    2

    文章

    439

    瀏覽量

    34227
  • 鴻蒙系統(tǒng)

    關注

    183

    文章

    2638

    瀏覽量

    66788
  • HarmonyOS
    +關注

    關注

    79

    文章

    1984

    瀏覽量

    30673

原文標題:鴻蒙版“抖音”,體驗賊好!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    分布式云化數(shù)據(jù)庫有哪些類型

    分布式云化數(shù)據(jù)庫有哪些類型?分布式云化數(shù)據(jù)庫主要類型包括:關系型分布式數(shù)據(jù)庫、非關系型分布式數(shù)據(jù)庫、新SQL分布式數(shù)據(jù)庫、以列方式存儲數(shù)據(jù)、
    的頭像 發(fā)表于 01-15 09:43 ?129次閱讀

    基于ptp的分布式系統(tǒng)設計

    在現(xiàn)代分布式系統(tǒng)中,精確的時間同步對于確保數(shù)據(jù)一致性、系統(tǒng)穩(wěn)定性和性能至關重要。PTP(Precision Time Protocol)是一種網(wǎng)絡協(xié)議,用于在分布式系統(tǒng)中實現(xiàn)高精度的時間同步
    的頭像 發(fā)表于 12-29 10:09 ?189次閱讀

    HarmonyOS Next 應用元服務開發(fā)-分布式數(shù)據(jù)對象遷移數(shù)據(jù)權(quán)限與基礎數(shù)據(jù)

    設備文件訪問實現(xiàn)文件的遷移,難以獲取文件同步完成的時間。為了保證更高的成功率,文件的遷移不建議繼續(xù)通過該方式實現(xiàn),推薦使用分布式數(shù)據(jù)對象攜帶資產(chǎn)的方式。開發(fā)者此前通過跨設備文件訪問實現(xiàn)
    發(fā)表于 12-24 09:40

    分布式通信的原理和實現(xiàn)高效分布式通信背后的技術NVLink的演進

    大型模型的大小已經(jīng)超出了單個 GPU 的范圍。所以就需要實現(xiàn)跨多個 GPU 的模型訓練,這種訓練方式就涉及到了分布式通信和 NVLink。 當談及分布式通信和 NVLink 時,我們進入了一個引人入勝且不斷演進的技術領域,下面我
    的頭像 發(fā)表于 11-18 09:39 ?663次閱讀
    <b class='flag-5'>分布式</b>通信的原理和<b class='flag-5'>實現(xiàn)</b>高效<b class='flag-5'>分布式</b>通信背后的技術NVLink的演進

    分布式光纖測溫解決方案

    分布式光纖測溫解決方案
    的頭像 發(fā)表于 11-12 01:02 ?246次閱讀
    <b class='flag-5'>分布式</b>光纖測溫解決方案

    分布式光纖測溫是什么?應用領域是?

    分布式光纖測溫是一種先進的溫度測量技術,它利用光纖的拉曼散射原理進行溫度監(jiān)測。以下是對分布式光纖測溫的詳細介紹: 一、基本原理 分布式光纖測溫的原理基于光纖的拉曼散射效應。當光纖某處的溫度發(fā)生變化
    的頭像 發(fā)表于 10-24 15:30 ?542次閱讀
    <b class='flag-5'>分布式</b>光纖測溫是什么?應用領域是?

    分布式光纖聲波傳感技術的工作原理

    分布式光纖聲波傳感技術(Distributed Acoustic Sensing,DAS)是一種利用光纖作為傳感元件,實現(xiàn)對沿光纖路徑上的環(huán)境參數(shù)進行連續(xù)分布式測量的技術。
    的頭像 發(fā)表于 10-18 14:50 ?1149次閱讀
    <b class='flag-5'>分布式</b>光纖聲波傳感技術的工作原理

    分布式輸電線路故障定位中的分布式是指什么

    的全面覆蓋。這些監(jiān)測點之間通過無線網(wǎng)絡進行數(shù)據(jù)互聯(lián),形成一個分布式的監(jiān)測系統(tǒng); 三相覆蓋:對于三相輸電線路,分布式故障定位系統(tǒng)會在每相上都安裝相應的監(jiān)測裝置,以實現(xiàn)對三相導線的全面監(jiān)控。 二、技術特點 行波測距
    的頭像 發(fā)表于 10-16 11:39 ?354次閱讀
    <b class='flag-5'>分布式</b>輸電線路故障定位中的<b class='flag-5'>分布式</b>是指什么

    鴻蒙跨端實踐-JS虛擬機架構(gòu)實現(xiàn)

    類似的框架,我們需要自行實現(xiàn)以確保核心基礎能力的完整。 鴻蒙虛擬機的開發(fā)經(jīng)歷了從最初 ArkTs2V8 到 JSVM + Roma新架構(gòu)方案 。在此過程中,我們實現(xiàn)了完整的鴻蒙版的“J
    的頭像 發(fā)表于 09-30 14:42 ?2543次閱讀
    <b class='flag-5'>鴻蒙</b>跨端實踐-<b class='flag-5'>JS</b>虛擬機架構(gòu)<b class='flag-5'>實現(xiàn)</b>

    鴻蒙開發(fā)管理:ohos.account.distributedAccount 分布式帳號管理

    獲取分布式帳號單實例對象。
    的頭像 發(fā)表于 07-08 10:03 ?318次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)管理:ohos.account.distributedAccount <b class='flag-5'>分布式</b>帳號管理

    鴻蒙ArkTS聲明開發(fā):跨平臺支持列表【分布式遷移標識】 通用屬性

    組件的分布式遷移標識,指明了該組件在分布式遷移場景下可以將特定狀態(tài)恢復到對端設備。
    的頭像 發(fā)表于 06-07 21:15 ?455次閱讀

    鴻蒙開發(fā)接口數(shù)據(jù)管理:【@ohos.data.distributedData (分布式數(shù)據(jù)管理)】

    分布式數(shù)據(jù)管理為應用程序提供不同設備間數(shù)據(jù)庫的分布式協(xié)同能力。通過調(diào)用分布式數(shù)據(jù)各個接口,應用程序可將數(shù)據(jù)保存到分布式數(shù)據(jù)庫中,并可對分布式
    的頭像 發(fā)表于 06-07 09:30 ?1102次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)接口數(shù)據(jù)管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b>數(shù)據(jù)管理)】

    HarmonyOS實戰(zhàn)案例:【分布式賬本】

    Demo基于Open Harmony系統(tǒng)使用ETS語言進行編寫,本Demo主要通過設備認證、分布式拉起、分布式數(shù)據(jù)管理等功能來實現(xiàn)
    的頭像 發(fā)表于 04-12 16:40 ?1407次閱讀
    HarmonyOS實戰(zhàn)案例:【<b class='flag-5'>分布式</b>賬本】

    鴻蒙HarmonyOS開發(fā)實戰(zhàn):【分布式音樂播放】

    本示例使用fileIo獲取指定音頻文件,并通過AudioPlayer完成了音樂的播放完成了基本的音樂播放、暫停、上一曲、下一曲功能;并使用DeviceManager完成了分布式設備列表的顯示和分布式能力完成了音樂播放狀態(tài)的跨設備分享。
    的頭像 發(fā)表于 04-10 17:51 ?962次閱讀
    <b class='flag-5'>鴻蒙</b>HarmonyOS開發(fā)實戰(zhàn):【<b class='flag-5'>分布式</b>音樂播放】

    Redis實現(xiàn)分布式多規(guī)則限流的方式介紹

    市面上很多介紹 Redis 如何實現(xiàn)限流的,但是大部分都有一個缺點,就是只能實現(xiàn)單一的限流,比如 1 分鐘訪問 1 次或者 60 分鐘訪問 10 次這種,但是如果想一個接口兩種規(guī)則都需要滿足呢,我們的項目又是分布式項目,應該如何
    的頭像 發(fā)表于 02-26 10:07 ?587次閱讀
    Redis<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>分布式</b>多規(guī)則限流的方式介紹
    主站蜘蛛池模板: 国产视频国产 | 乱码一区二区三区完整视频 | 免费人成网站线观看合集 | 欧美一区二区视频在线观看 | 午夜激情网站 | 37pao强力打造免费高速高清 | 欧美啪啪精品 | 18男女很黄的视频 | 午夜噜噜噜私人影院在线播放 | 一级毛毛片毛片毛片毛片在线看 | 黄www色 | 亚洲欧美高清 | 5566在线观看| 欧美日韩亚洲国产一区二区综合 | 中文在线1区二区六区 | 国产成人精品午夜二三区 | 狠狠色狠狠色 | 色婷婷综合久久久久中文一区二区 | 91视频色| 欧美成人h精品网站 | 精品国产第一国产综合精品gif | 人人添人人澡人人澡人人人爽 | 亚洲午夜一区二区三区 | 痴女中文字幕在线视频 | 激情五月视频 | 欧美黄色录像视频 | 天天澡天天摸天天添视频 | 四虎影院在线播放 | 韩国三级久久精品 | 久久99精品久久久久久久不卡 | 色免费网站 | 天天摸夜夜摸夜夜狠狠摸 | 五月激情婷婷网 | 欧美一卡2卡三卡四卡五卡 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 国产一级特黄aa级特黄裸毛片 | 亚洲色图综合图片 | 大蕉久久伊人中文字幕 | 天堂视频免费在线观看 | 2017天天干夜夜操 | 亚洲国产精品久久久久婷婷软件 | 中文字幕首页 |