[Share Experiences] HarmonyOS开发者创新大赛获奖作品分享——《分镜头App》
Tofloor
poster avatar
adm101
deepin
2021-07-31 02:56
Author

身处万物互联时代,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,以替换之前的数据。

其次,需要创建一个实体类。成员变量中,需要有两个基础变量:

  1. operationType:int型,当前协同操作的类型;
  2. targetDeviceId:List,需要协同的设备id数组;

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

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

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

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

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

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

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

分布式协同流程如下:

总结

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

Reply Favorite View the author
All Replies
jorsion
deepin
2021-07-31 03:26
#1

就问什么时候有deepin版的deveco studio?

Reply View the author
蒙笛
deepin
2021-07-31 16:14
#2

点赞楼主,点赞鸿蒙,期待在linux端实现多屏协同,早日推出linux版deveco studio。

Reply View the author
神末shenmo
deepin
Spark-App
Q&A Team
2021-07-31 17:05
#3

......这个就叫分布式啊

有点夸大嫌疑,远程唤醒也能分布式。。。这个很多实现吧

感觉有点类似dtk,把很多的功能重新打包来简化开发

之前看有关分析也能看出华为确实套了个大壳,可以逐渐改接口

仍然不认同虚假宣传,不过用自有函数写代码确实是开始圆吹的牛逼了

而且看起来还是有一定实用性的

那这就要支持

Reply View the author
impressionyang
deepin
2021-07-31 17:40
#4
神末shenmo

......这个就叫分布式啊

有点夸大嫌疑,远程唤醒也能分布式。。。这个很多实现吧

感觉有点类似dtk,把很多的功能重新打包来简化开发

之前看有关分析也能看出华为确实套了个大壳,可以逐渐改接口

仍然不认同虚假宣传,不过用自有函数写代码确实是开始圆吹的牛逼了

而且看起来还是有一定实用性的

那这就要支持

  你的理解有点偏颇了,鸿蒙的分布式是能够将多个不同硬件设备的能力(算力、存储、硬件资源等)统一进行管理,使得在当前的鸿蒙网络(连接了多个鸿蒙设备)的终端能够对所有这些设备的功能进行调度。

  就像这次的这个分镜头相机例子,设备A可以是搭载红鸿蒙系统的手表,然后设备B是搭载鸿蒙系统的手机,然后手表通过分布式调动能够调起手机的拍照功能进行拍照,并且将文件同步进手表中,这只是其中的一种应用。

  当然,如果你使用自己打造的应用也能基本达到分布式的要求,为了追求这个功能而忽略了系统的统一性,会造成很多不必要的开发成本。而鸿蒙这次推出的分布式应用是在底层已经帮我们封装好了分布式的基础功能并且已经是设备级的特性了,所以说还是比较好的。

  对比来说苹果的一些相关特性反倒是没有鸿蒙的好。以上仅为个人理解,鸿蒙的开发经验不多,有问题麻烦大家指教,谢谢。

 

Reply View the author
神末shenmo
deepin
Spark-App
Q&A Team
2021-07-31 18:01
#5
impressionyang

  你的理解有点偏颇了,鸿蒙的分布式是能够将多个不同硬件设备的能力(算力、存储、硬件资源等)统一进行管理,使得在当前的鸿蒙网络(连接了多个鸿蒙设备)的终端能够对所有这些设备的功能进行调度。

  就像这次的这个分镜头相机例子,设备A可以是搭载红鸿蒙系统的手表,然后设备B是搭载鸿蒙系统的手机,然后手表通过分布式调动能够调起手机的拍照功能进行拍照,并且将文件同步进手表中,这只是其中的一种应用。

  当然,如果你使用自己打造的应用也能基本达到分布式的要求,为了追求这个功能而忽略了系统的统一性,会造成很多不必要的开发成本。而鸿蒙这次推出的分布式应用是在底层已经帮我们封装好了分布式的基础功能并且已经是设备级的特性了,所以说还是比较好的。

  对比来说苹果的一些相关特性反倒是没有鸿蒙的好。以上仅为个人理解,鸿蒙的开发经验不多,有问题麻烦大家指教,谢谢。

 

所以说我说像dtk,打包了一下

至于分布式

虽然但是,我把私房钱分成几份存起来也叫分布式储存但是一般不会这么叫吧

Reply View the author
lixiaobai
deepin
2021-07-31 18:20
#6

windows 11发布了,鸿蒙开发套件要适配,哪有时间去适配linux。再说鸿蒙认为自己是国产系统的正统,主要还是统一国内市场,竞争不过win和安卓也没什么,不发布linux版也是打压其他国产系统建立优势的方式。

Reply View the author
impressionyang
deepin
2021-08-05 17:37
#7
神末shenmo

所以说我说像dtk,打包了一下

至于分布式

虽然但是,我把私房钱分成几份存起来也叫分布式储存但是一般不会这么叫吧

  怎么说呢,鸿蒙的这个分布式理念不能仅仅考虑应用层上面的封装思想,它还涉及到了通讯链路层这些层面,毕竟他要连接的不仅仅只有手机平板这些,包括其他的红鸿蒙设备也要有接入能力。在应用层上,你可以说像dtk一样封装打包了一下,然后开发者调用接口去使用分布式功能。但是这个分布式功能或者理念的重点不是体现在应用层上,毕竟在应用层上做分布式功能大公司都能做,重点是在于鸿蒙的这个网络框架上面的实现,在数据链路层或着是网络层上面就着手做了布置,在HarmonyOS中,从嵌入式设备到我们使用的平板手机,搭载了鸿蒙系统后使用的是一套兼容的鸿蒙网络体系,他是体现在系统层面上的,不是说在应用层面。

  关于你说的和dtk像,我也赞同,确实在应用开发的方面确实是和dtk那样的开发理念进行开发的,也没有问题,但是分布式这个概念的提出的话是鸿蒙区别于“别的操作系统”的隔离性下能够进行对分布式操作的一个优势,并且会持续为鸿蒙的扩大提供支持。点出分布式我认为是可以的。

Reply View the author
神末shenmo
deepin
Spark-App
Q&A Team
2021-08-05 19:55
#8
impressionyang

  怎么说呢,鸿蒙的这个分布式理念不能仅仅考虑应用层上面的封装思想,它还涉及到了通讯链路层这些层面,毕竟他要连接的不仅仅只有手机平板这些,包括其他的红鸿蒙设备也要有接入能力。在应用层上,你可以说像dtk一样封装打包了一下,然后开发者调用接口去使用分布式功能。但是这个分布式功能或者理念的重点不是体现在应用层上,毕竟在应用层上做分布式功能大公司都能做,重点是在于鸿蒙的这个网络框架上面的实现,在数据链路层或着是网络层上面就着手做了布置,在HarmonyOS中,从嵌入式设备到我们使用的平板手机,搭载了鸿蒙系统后使用的是一套兼容的鸿蒙网络体系,他是体现在系统层面上的,不是说在应用层面。

  关于你说的和dtk像,我也赞同,确实在应用开发的方面确实是和dtk那样的开发理念进行开发的,也没有问题,但是分布式这个概念的提出的话是鸿蒙区别于“别的操作系统”的隔离性下能够进行对分布式操作的一个优势,并且会持续为鸿蒙的扩大提供支持。点出分布式我认为是可以的。

关于系统级分布式链路的技术原理和它相对于应用上分布式实现的优势,愿闻其详

 

Reply View the author
impressionyang
deepin
2021-08-11 17:52
#9
神末shenmo

关于系统级分布式链路的技术原理和它相对于应用上分布式实现的优势,愿闻其详

 

    我这边是做嵌入式开发工作的,之前也做过应用开发,你要说具体原理我也不会说理解太深,设涉及到协议栈的开发我这里就没有太多的了解了,就我这边的工作涉及的方面来说,相对于应用上做分布式,系统级指的是鸿蒙从嵌入式小系统的harmony liteos core A/M(智能家居)到harmony embedded Linux(平板手机智慧屏等)的内核框架层面上使用了同一套API进行设备间的交互,该套API与鸿蒙在这些内核的通讯协议栈结合进行不同设备间的相互通讯如文件传输、控制流转等分布式应用会得到更好的延时、响应的优化,并且鸿蒙在构建时就是原生使用该套API和协议栈的,不是后期植入(但是windows上面的华为电脑管家应该是在应用上做了兼容层,所以响应上来说没有手机和pad上的好)。

    相对于应用级分布式实现,一般基于通用的通讯协议如蓝牙通讯协议,socket通讯协议或者http/https通讯等方式在不同设备间通过这些通用的协议进行数据的传输、解析并应用,而普通的通用协议间通讯,不同的设备间的通讯延时是会有显著提升的(及时在局域网下),并且伴随着不同设备下的开发要对通用协议的通讯做兼容,从而会造成开发成本过高。

    以上是做为鸿蒙应用场景内的harmony分布式开发与普通应用层面上做分布式开发所涉及的一些技术上的差异。这里需要注意的一点,你可能在桌面式应用开发如Deepin Linux DTK上有比较深的网络开发相关经验,但是鸿蒙下的棋并没有深入到pc桌面系统领域,更是更为广泛的Iot智能产品市场,在嵌入式开发场景下并不像在桌面进行开发那般做分布式仅仅是在不同的桌面操作系统间(或者桌面操作系统和手机间)的通信,而是在任何智能产品上的一个互联,也就是万物互联的初衷了。而在嵌入式开发中,如果是嵌入式Linux还好,在嵌入式裸机或者实时系统下面要想做到很 高效 的分布式开发(即尝试做到多个不同芯片、外设的设备间进行资源共享),其难度很多中小公司都拿不出太好的方案。

  你在Linux下做应用开发有很多经验,相信你去多看看鸿蒙的技术文档,你就会理解我上面说的内容,当然,你也可以往嵌入式开发这边做了解,但是嵌入式开发不像做桌面应用开发,嵌入式开发所需要的开发成本会比较高,但是嵌入式开发是能够深入到我们生活中很多方面的一个技术,可以让你看到一个不一样的物联网世界。当然做什么类型的开发都是学无止境的,所以说仅仅是参考,话说,星火商店该更新了!!!上大学后也不能停下脚步啊,加油!

Reply View the author
神末shenmo
deepin
Spark-App
Q&A Team
2021-08-11 19:15
#10
impressionyang

    我这边是做嵌入式开发工作的,之前也做过应用开发,你要说具体原理我也不会说理解太深,设涉及到协议栈的开发我这里就没有太多的了解了,就我这边的工作涉及的方面来说,相对于应用上做分布式,系统级指的是鸿蒙从嵌入式小系统的harmony liteos core A/M(智能家居)到harmony embedded Linux(平板手机智慧屏等)的内核框架层面上使用了同一套API进行设备间的交互,该套API与鸿蒙在这些内核的通讯协议栈结合进行不同设备间的相互通讯如文件传输、控制流转等分布式应用会得到更好的延时、响应的优化,并且鸿蒙在构建时就是原生使用该套API和协议栈的,不是后期植入(但是windows上面的华为电脑管家应该是在应用上做了兼容层,所以响应上来说没有手机和pad上的好)。

    相对于应用级分布式实现,一般基于通用的通讯协议如蓝牙通讯协议,socket通讯协议或者http/https通讯等方式在不同设备间通过这些通用的协议进行数据的传输、解析并应用,而普通的通用协议间通讯,不同的设备间的通讯延时是会有显著提升的(及时在局域网下),并且伴随着不同设备下的开发要对通用协议的通讯做兼容,从而会造成开发成本过高。

    以上是做为鸿蒙应用场景内的harmony分布式开发与普通应用层面上做分布式开发所涉及的一些技术上的差异。这里需要注意的一点,你可能在桌面式应用开发如Deepin Linux DTK上有比较深的网络开发相关经验,但是鸿蒙下的棋并没有深入到pc桌面系统领域,更是更为广泛的Iot智能产品市场,在嵌入式开发场景下并不像在桌面进行开发那般做分布式仅仅是在不同的桌面操作系统间(或者桌面操作系统和手机间)的通信,而是在任何智能产品上的一个互联,也就是万物互联的初衷了。而在嵌入式开发中,如果是嵌入式Linux还好,在嵌入式裸机或者实时系统下面要想做到很 高效 的分布式开发(即尝试做到多个不同芯片、外设的设备间进行资源共享),其难度很多中小公司都拿不出太好的方案。

  你在Linux下做应用开发有很多经验,相信你去多看看鸿蒙的技术文档,你就会理解我上面说的内容,当然,你也可以往嵌入式开发这边做了解,但是嵌入式开发不像做桌面应用开发,嵌入式开发所需要的开发成本会比较高,但是嵌入式开发是能够深入到我们生活中很多方面的一个技术,可以让你看到一个不一样的物联网世界。当然做什么类型的开发都是学无止境的,所以说仅仅是参考,话说,星火商店该更新了!!!上大学后也不能停下脚步啊,加油!

非常感谢解答!

星火商店现在正在重写中......

Reply View the author