0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙版JS如何实现分布式仿抖音应用

OpenHarmony技术社区 来源:鸿蒙技术社区 作者:陈建朋 2021-11-15 09:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

之前大家看过了 Java 版的《HarmonyOS 分布式之仿抖音应用》,现在讲讲 JS 如何实现分布式仿抖音应用,通过 JS 方式开发视频播放,分布式设备迁移,评论,通过 Java 和 JS 交互,获取设备信息,选择设备信息做分布式迁移。

功能:分布式迁移到不同设备,视频进行评论,播放视频,可以像抖音一样切换视频,可以点赞,分享等操作。

开发版本: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"
}]
②仿抖音视频切换

有关视频切换的开发 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】(负责信息发送),可参见有关文档。
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

评论功能有两部分,评论列表和评论发送输入框。

<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">发送button>
div>
div>

功能实现逻辑:

change(e){//监听输入框信息变化获取信息
this.message=e.value;
console.log("message==="+this.message)
},

sendmessage(){//提交信息后组织数据刷新界面
this.todolist.push({
name:'王者',
detail:this.message,
})
this.content="";
this.message="";
},
④JS 和 Java 交互获取设备信息 在实现分布式设备迁移的时候查找 js 没有找到获取设备信息的有关接口,所以考虑通过 js 和 Java 相互调用实现。通过 jsFA 调用 Java PA机制,实现数据的获取和传递。 js 端实现如下:

重点:
  • Ability 类型,对应 PA 端不同的实现方式:0:Ability,1:Internal Ability。

  • syncOption PA 侧请求消息处理同步/异步选项: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;//传递数据
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 端实现如下:

Java 端需要创建一个 ability 服务继承 AceInternalAbility 具体是使用哪种类型,看上面的解释。

创建后需要注册,比如我创建的是 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
//返回结果当前仅支持String,对于复杂结构可以序列化为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 调用后会进入 Java 的 onRemoteRequest 函数进行数据解析和组织,然后通过如下接口将需要的结果回传给 js 做界面展示和操作。

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

获取设备信息:

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

⑤分布式迁移

鸿蒙中分布式迁移真的是做到了强大,在 js 中只需要四个函数就能完成分布式迁移。

onSaveData(saveData){//数据保存到savedData中进行迁移。
vardata={
list:this.list,
player_index:this.player_index,
};
Object.assign(saveData,data)
},
onRestoreData(restoreData){//收到迁移数据,恢复。
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;
},

迁移:上面的四个有关函数设置好后执行下面的接口就能实现分布式迁移了。

continueVideoAbility:asyncfunction(){
letconti=awaitFeatureAbility.continueAbility();
}
⑥权限

需要加上需要的权限:

"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
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 应用
    +关注

    关注

    2

    文章

    479

    浏览量

    34902
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2642

    浏览量

    70106
  • HarmonyOS
    +关注

    关注

    80

    文章

    2156

    浏览量

    36277

原文标题:鸿蒙版“抖音”,体验贼好!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    2022全新版!Java分布式架构设计与开发实战(完结)

    历史数据;一致性哈希则在节点增减时最小化数据迁移量,通过虚拟节点技术实现负载均衡,特别适合动态扩展的分布式集群。 全局唯一ID生成是分库分表必须解决的基础问题。传统数据库自增ID在多分片环境下会导致ID冲突
    发表于 03-30 15:20

    分布式 IO 选型注意事项

    在工业 4.0 浪潮推动下,分布式 IO 作为工业互联的核心底层设备,已成为制造业实现设备互联、数据采集、柔性生产的关键支撑。本文将助力企业避开选型误区,最大化发挥分布式 IO 的应用价值。​ 产品
    的头像 发表于 12-30 14:14 501次阅读
    <b class='flag-5'>分布式</b> IO 选型注意事项

    SC-3568HA:解锁鸿蒙全权限API与分布式能力的工业控制平台

    传统嵌入开发面临硬件碎片化、高权限功能缺失、分布式协同复杂及自动化测试不足等痛点。SC-3568HA开发板基于鸿蒙系统,通过统一内核抽象层和硬件驱动框架解决兼容问题,开放全量系统API支持高权限
    的头像 发表于 12-18 11:27 7509次阅读
    SC-3568HA:解锁<b class='flag-5'>鸿蒙</b>全权限API与<b class='flag-5'>分布式</b>能力的工业控制平台

    如何解决分布式光伏计量难题?

    分布式光伏成增长主力 据《2025-2030年中国分布式光伏行业市场前景预测及未来发展趋势研究报告》显示,2024年中国分布式光伏新增装机118.18GW,同比增长23%,占光伏新增装机总量的43
    的头像 发表于 11-07 14:55 400次阅读
    如何解决<b class='flag-5'>分布式</b>光伏计量难题?

    【节能学院】Acrel-1000DP分布式光伏监控系统在奉贤平高食品 4.4MW 分布式光伏中应用

    分布式光伏本地和远程通信方案,并研究分布式光伏采集模型的构建、多源数据融合估计、面向分布式光伏的有功、无功功率优化控制等关键技术,实现了对小容量工商业
    的头像 发表于 08-23 08:04 3638次阅读
    【节能学院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏监控系统在奉贤平高食品 4.4MW <b class='flag-5'>分布式</b>光伏中应用

    分布式光伏发电监测系统技术方案

    分布式光伏发电监测系统技术方案 柏峰【BF-GFQX】一、系统目标 :分布式光伏发电监测系统旨在通过智能化的监测手段,实现分布式光伏电站的全方位、高精度、实时化管理。该系统能
    的头像 发表于 08-22 10:51 3438次阅读
    <b class='flag-5'>分布式</b>光伏发电监测系统技术方案

    电商 API 接口:平台电商活动热度实时监测

    作为全球领先的短视频平台,其电商业务近年来蓬勃发展,吸引了众多商家和消费者。实时监测电商活动热度,对于商家优化营销策略、平台提升用户体验至关重要。电商 API 接口为开发者
    的头像 发表于 08-21 15:30 912次阅读
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API 接口:<b class='flag-5'>抖</b><b class='flag-5'>音</b>平台电商活动热度实时监测

    揭秘电商 API,让小店粉丝增长有迹可循

    “透明路径”。本文将逐步揭秘电商 API 的使用方法,帮助您实现粉丝增长的可视化与可控化。 一、什么是电商 API?
    的头像 发表于 08-20 15:46 1007次阅读
    揭秘<b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API,让<b class='flag-5'>抖</b><b class='flag-5'>音</b>小店粉丝增长有迹可循

    巧用电商 API,精准分析商品种草效果

    API,结合数据分析,实现精准量化种草效果。文章结构清晰,从基础概念到实践步骤,逐步指导您操作。所有方法基于真实电商场景,确保可靠性和可操作性。 一、电商 API 简介与接入
    的头像 发表于 08-20 15:29 1334次阅读
    巧用<b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API,精准分析<b class='flag-5'>抖</b><b class='flag-5'>音</b>商品种草效果

    电商 API 接口:开启小店直播带货数据新洞察

    深入探讨该 API 如何赋能用户,实现直播带货数据的实时监控、深度分析和决策支持,开启数据驱动的新时代。 一、电商 API 接口的核心功能
    的头像 发表于 08-20 15:20 1342次阅读
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API 接口:开启<b class='flag-5'>抖</b><b class='flag-5'>音</b>小店直播带货数据新洞察

    分布式光伏总出问题?安科瑞分布式光伏监控系统来“救场”

    一、分布式光伏的痛点大揭秘 在 “双碳” 目标的大力推动下,分布式光伏作为绿色能源领域的重要力量,正以前所未有的速度蓬勃发展,越来越多的企业和家庭选择安装分布式光伏系统。然而,随着分布式
    的头像 发表于 07-16 16:50 937次阅读
    <b class='flag-5'>分布式</b>光伏总出问题?安科瑞<b class='flag-5'>分布式</b>光伏监控系统来“救场”

    分布式IO选型指南:2025年分布式无线远程IO品牌及采集控制方案详解

    近年来,随着工业物联网(IIoT)、智能制造和工业4.0的深入发展,分布式无线远程IO模块在工业控制领域的应用愈发广泛。这种模块通过无线方式实现远程数据采集与控制,极大地提高了工业设施的灵活性和效率
    的头像 发表于 06-23 09:48 1404次阅读

    双电机分布式驱动汽车高速稳定性机电耦合控制

    力矩,实现极限工况下的整车高速稳定性控制。结果表明,采用机电耦合控制,除了可以实现两侧分布式驱动系统的动力耦合,起到增强车辆高速稳定性的作用,还能够协调两侧驱动系统的转矩输出,抑制驱动力矩波动,降低电机
    发表于 06-18 16:37

    曙光存储领跑中国分布式存储市场

    近日,赛迪顾问发布《中国分布式存储市场研究报告(2025)》,指出2024 年中国分布式存储市场首次超过集中式存储,规模达 198.2 亿元,增速 43.7%。
    的头像 发表于 05-19 16:50 1431次阅读

    分布式光伏电力问题层出不穷?安科瑞分布式光伏运维系统来“救场”

    一、分布式光伏电力运维,痛点大揭秘​ ​ 分布式光伏作为实现绿色能源转型的关键一环,近年来在我国得到了迅猛发展。国家能源局数据显示,截至 2023 年底,中国分布式光伏电站累计并网容量
    的头像 发表于 05-07 17:14 1079次阅读
    <b class='flag-5'>分布式</b>光伏电力问题层出不穷?安科瑞<b class='flag-5'>分布式</b>光伏运维系统来“救场”