共计 2907 个字符,预计需要花费 8 分钟才能阅读完成。
身处万物互联时代,HarmonyOS 为跨端操作提供了全新的用户体验,也给开发者带来了全新的开发挑战,与以往的手机利用开发相比,基于 HarmonyOS,须要开发者去考虑如何开发全新模式下的利用。
在近期完结的 HarmonyOS 开发者翻新大赛上,由独立开发者殷冬开发的《分镜头 App》利用取得了二等奖的佳绩。作为一款拍摄类利用,《分镜头 App》创造性地应用了 HarmonyOS 的分布式技术,可实现用一个手机管制组网内多个相机进行拍照、录像,并提供分布式拍摄、分布式相册、分布式图片丑化等性能,为用户提供了全新的拍摄体验。
《分镜头 App》的创作灵感来源于殷冬的日常察看,他发现平时人们在自拍时,往往会用前置摄像头,因为像素、取景景别等因素的限度,前摄拍进去的成果往往不是很现实;此外,当咱们帮别人拍照时,对方也无奈实时看到照片的取景角度和构图,拍进去的照片也很难让对方称心;对于照片的分享和丑化,更是众口难调。为了解决这些痛点,晋升用户的拍照体验,通过一直摸索,殷冬发现 HarmonyOS 的分布式技术有着很大的利用后劲。于是他基于 HarmonyOS 从 0 到 1 实现了《分镜头 App》的开发。
以下将为大家分享该款利用的开发者殷冬的开发心得。
HarmonyOS 技术应用
《分镜头 App》次要用到了分布式文件服务、分布式硬件虚拟化、以及分布式数据服务。
分布式文件服务
利用分布式文件服务,能够主动同步其余设施拍摄的照片和视频,实现分布式相册性能。
起初殷冬认为分布式文件服务应用起来会很简单,例如是否须要本人管制同步、初始化性能等等。而真正接触后他发现,在底层上,分布式文件服务曾经将简单的工作都解决好了,须要用一行代码,就能够应用分布式文件服务,就相当于调用本地文件系统一样,只不过再持续向下,底层会帮忙开发者解决很多业务。
分布式硬件虚拟化
分布式硬件虚拟化的个性,能够调用其余设施的硬件,实现相干的性能。在《分镜头 App》中,调用其余设施的相机画面,就用到了分布式硬件虚拟化。并且能够管制拍摄画面的比例,实现不一样的拍摄成果。
殷冬最后接触硬件虚拟化这个概念的时候,只是晓得是基于分布式软总线实现的虚拟化,至于怎么应用,并不是很分明,起初通过深刻的学习发现,被动调用其余设施的接口,能够应用分布式任务调度或者 IDL 接口两种办法实现。而分布式任务调度和 IDL 接口,都能够传递实现 Sequenceable 接口的实现类对象。
而硬件性能要害类都实现了 Sequenceable 接口,比方:相机预览画面的要害类 Surface,就实现了 Sequenceable 接口。因而能够通过 IDL 将设施 A 的 Surface 对象,以参数的模式,传递到设施 B。设施 B 的 Service Ability 执行相机初始化操作,就能够拿到设施 B 相机的拍摄画面。
由此,就在代码编辑层面实现了硬件虚拟化。
分布式数据服务
在《分镜头 App》中,有很多的协同操作。协同操作的外围逻辑,利用了分布式数据服务的数据变更告诉性能。当一个设施触发协同操作时,通过变更告诉,从设施触发 UI 和成果的变动,实现分布式协同性能。
分布式数据服务有两个性能,能够为开发者带来很大的便捷。第一个是多端数据同步性能,当通过一个设施批改了数据库中的数据,其余设施也会做同步。第二个是在增加、批改、删除数据库数据时,其余设施如果创立了数据库的链接,并绑定了数据变更监听时,就会触发该监听。开发者能够利用这两个性能个性,做多端的协同性能。
数据库初始化:
数据库变更监听:
分布式相册实现
相册次要存储图片、视频文件,能够应用分布式文件服务进行存储。此项性能殷冬还须要实现动静增加的成果,即:其余设施拍摄时,本机的相册列表动态显示刚刚拍摄的照片缩略图。这种成果能够在确定应用分布式文件服务存储照片和视频后,应用 HarmonyOS 的公共事件与告诉性能,从而实现动静加载的成果。
在拍摄实现时,通过公共事件性能发送一条播送。
同时,在相册模块,注册公共事件,用于解决接管到告诉后的动静增加缩略图逻辑。
分布式文件服务负责同步拍摄的照片、视频等信息,公共事件告诉则被动进行页面的刷新,二者合用,实现动静增加的成果。
多设施协同实现
指标设施未关上协同页面问题解决
多设施协同实际上有个暗藏的前提,那就是所有设施都处于同一个协同页面中。这须要解决指标设施不在协同页面的问题。
此时能够创立一个单版本分布式数据库,key 值为设施 id,value 值为协同页面是否启动 true/false。当进入到协同页面时,在 onStart 办法中设置值为 true。当退出页面时,在 onInactive 办法中设置值为 false。
在发动协同前,能够通过单版本分布式数据库,获取到指标设施是否启动了协同页面。
如果没有启动,能够先通过 abilitySlice.startAbility()将指标设施拉起,进入到协同页面,而后再进入协同状态。
如果指标设施曾经处于协同页面,就能够间接进入到协同状态。
对立治理分布式操作
因为分布式数据服务每个利用最多同时关上 16 个 KvStore,所以不能每一个协同操作都应用一个数据库。这里能够在 value 值上做文章,以实现通过一个分布式数据库,就能够实现一个页面中的多个操作的协同。
首先,能够应用一个常量作为分布式协同数据库的 key。每次 put 时,都应用这个常量作为 key,以替换之前的数据。
其次,须要创立一个实体类。成员变量中,须要有两个根底变量:
operationType:int 型,以后协同操作的类型;
targetDeviceId:List<String>,须要协同的设施 id 数组;
operationType 字段次要是用来辨别以后的操作类型,这样不便调用雷同的性能进行协同操作。targetDeviceId 次要是存储向哪些设施发动协同操作,能够通过判断本设施 id 是否在数组当中,如果不存在,就不做任何操作。
此时须要将实体类转换成字符串,再存储到分布式协同数据库中。因而,能够通过 JSONObject.toJSONString(),将实体类转换成字符串并进行存储。
被调用方须要为分布式数据库,绑定数据变更监听。这样,其余设施增加或批改数据的时候,就会触发监听。监听类型要设施其余设施触发的变动,这样能够防止本地批改也会触发本地的监听的问题。
在监听中就能够解决协同的性能。首先要判断变更的数据是否为空,防止后续出错。而后能够将 key 的 json 值取出,并做非空判断。
接下来须要将 json 字符串转换成实体类,便于后续操作。这里能够应用 JSONArray.parseObject(json, class)进行转换。
而后进行判断,是否须要本设施进行协同。
当本设施须要协同时,能够通过 switch 依据操作类型,调用不同的办法进行协同即可。
分布式协同流程如下:
总结
殷冬通过官网文档、论坛、HarmonyOS 技术社区等路径,零碎的学习和理解 HarmonyOS 的个性,最终开发了本次大赛的《分镜头 App》作品。将来,他还将继续深刻理解 HarmonyOS,尝试开发更为乏味的 HarmonyOS 分布式应用,也期待更多开发者退出到 HarmonyOS 生态,一起发明有限可能!