分享发现 HarmonyOS 开发者创新大赛获奖作品分享——《分镜头 App》

yuanguanhua(智能互联) · July 30, 2021 · 13 hits

身处万物互联时代,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,需要协同的设备 id 数组;

operationType 字段主要是用来区分当前的操作类型,这样方便调用相同的功能进行协同操作。targetDeviceId 主要是存储向哪些设备发起协同操作,可以通过判断本设备 id 是否在数组当中,如果不存在,就不做任何操作。

此时需要将实体类转换成字符串,再存储到分布式协同数据库中。因此,可以通过 JSONObject.toJSONString(),将实体类转换成字符串并进行存储。

在这里插入图片描述

被调用方需要为分布式数据库,绑定数据变更监听。这样,其他设备添加或修改数据的时候,就会触发监听。监听类型要设备其他设备触发的变化,这样可以避免本地修改也会触发本地的监听的问题。

在这里插入图片描述

在监听中就可以处理协同的功能。首先要判断变更的数据是否为空,避免后续出错。然后可以将 key 的 json 值取出,并做非空判断。

在这里插入图片描述

接下来需要将 json 字符串转换成实体类,便于后续操作。这里可以使用 JSONArray.parseObject(json, class) 进行转换。

在这里插入图片描述

然后进行判断,是否需要本设备进行协同。

在这里插入图片描述

当本设备需要协同时,可以通过 switch 根据操作类型,调用不同的方法进行协同即可。

在这里插入图片描述

分布式协同流程如下:

在这里插入图片描述

总结

殷冬通过官方文档、论坛、HarmonyOS 技术社区等途径,系统的学习和了解 HarmonyOS 的特性,最终开发了本次大赛的《分镜头 App》作品。未来,他还将持续深入了解 HarmonyOS,尝试开发更为有趣的 HarmonyOS 分布式应用,也期待更多开发者加入到 HarmonyOS 生态,一起创造无限可能!

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.