专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

鸿蒙上成功调用相机!

  相机是一个系统的基础能力,能够通过调用相机进行拍照,在很多场景下都会使用到相机的调用,如人脸识别门禁,人脸解锁等操作。
  本文主要介绍在OpenHarmony应用开发中ArkUI开发框架下相机应用的开发。开发模式:Stage开发模式SDK版本:3。2。2。5开发环境:DevEcoStudio3。0Release3。0。0。993
  相机调用成功如下图:
  实现步骤声明权限在module。json5中配置权限:reqPermissions:〔{name:ohos。permission。LOCATION,},{name:ohos。permission。CAMERA},{name:ohos。permission。MICROPHONE},{name:ohos。permission。MEDIALOCATION},{name:ohos。permission。WRITEMEDIA},{name:ohos。permission。READMEDIA}〕在MainAbility。ts中调用requestPermissionsFromUser方法申请权限:constPERMISSIONS:Arraystring〔ohos。permission。CAMERA,ohos。permission。MICROPHONE,ohos。permission。MEDIALOCATION,ohos。permission。READMEDIA,ohos。permission。WRITEMEDIA,ohos。permission。GETWIFIINFO,ohos。permission。GETWIFIPEERSMAC,〕globalThis。abilityWantwant;globalThis。contextthis。contextglobalThis。abilityContextthis。context;globalThis。context。requestPermissionsFromUser(PERMISSIONS)。then((message){console。log(JSON。stringify(message))})
  注意:权限需要在页面加载前提前申请,所以需要在调用相机的页面前添加一个过渡的页面。准备工作导包:importcamerafromohos。multimedia。camera;importimagefromohos。multimedia。image;importfileiofromohos。fileio;importmediaLibraryfromohos。multimedia。mediaLibraryconstCameraSize{WIDTH:640,HEIGHT:480}
  定义变量:privatemXComponentControllernewXComponentController()privatecameraManager:camera。CameraManagerundefinedprivatecameras:Arraycamera。CameraundefinedprivatecameraId:stringundefinedprivatemReceiver:image。ImageReceiverundefinedprivatecameraInput:camera。CameraInputundefinedprivatepreviewOutput:camera。PreviewOutputundefinedprivatemSurfaceId:stringundefinedprivatephotoOutput:camera。PhotoOutputundefinedprivatecaptureSession:camera。CaptureSessionundefinedprivatemediaUtil:MediaUtilundefinedStatedesStr:stringprivatefileAsset:mediaLibrary。FileAssetprivatesurfaceId:numberStatephotoUriMedia:stringprivatephotoFlag:booleantrueStateimgUrl:stringStateisMediaUrl:booleantrue判断保存路径为是沙箱路径或者媒体路径,默认媒体路径aboutToAppear(){this。mediaTestmediaLibrary。getMediaLibrary(globalThis。context)}
  工具方法:asynccreateAndGetUri(mediaType:number){letinfothis。getInfoFromType(mediaType)letdateTimeUtilnewDateTimeUtil()letname{dateTimeUtil。getDate()}{dateTimeUtil。getTime()}letdisplayName{info。prefix}{name}{info。suffix}letpublicPathawaitthis。mediaTest。getPublicDirectory(info。directory)letdataUriawaitthis。mediaTest。createAsset(mediaType,displayName,publicPath)returndataUri}asyncgetFdPath(fileAsset:any){letfdawaitfileAsset。open(Rw)returnfd}getInfoFromType(mediaType:number){letresult{prefix:,suffix:,directory:0}switch(mediaType){casemediaLibrary。MediaType。FILE:result。prefixFILEresult。suffix。txtresult。directorymediaLibrary。DirectoryType。DIRDOCUMENTSbreakcasemediaLibrary。MediaType。IMAGE:result。prefixIMGresult。suffix。jpgresult。directorymediaLibrary。DirectoryType。DIRIMAGEbreakcasemediaLibrary。MediaType。VIDEO:result。prefixVIDresult。suffix。mp4result。directorymediaLibrary。DirectoryType。DIRVIDEObreakcasemediaLibrary。MediaType。AUDIO:result。prefixAUDresult。suffix。wavresult。directorymediaLibrary。DirectoryType。DIRAUDIObreak}returnresult}
  工具类:file日期工具exportdefaultclassDateTimeUtil{时分秒getTime(){constDATETIMEnewDate()returnthis。concatTime(DATETIME。getHours(),DATETIME。getMinutes(),DATETIME。getSeconds())}年月日getDate(){constDATETIMEnewDate()returnthis。concatDate(DATETIME。getFullYear(),DATETIME。getMonth()1,DATETIME。getDate())}日期不足两位补充0paramvalue数据值fill(value:number){return(value9?:0)value}年月日格式修饰paramyearparammonthparamdateconcatDate(year:number,month:number,date:number){return{year}{this。fill(month)}{this。fill(date)}}时分秒格式修饰paramhoursparamminutesparamsecondsconcatTime(hours:number,minutes:number,seconds:number){return{this。fill(hours)}{this。fill(minutes)}{this。fill(seconds)}}}
  这个工具类主要是用来进行获取时间对相片进行命名的工具类。构建UI组件
  页面主要分为2块,左边为相机的XComponent组件,右边为图片显示区域。拍完的照片能够显示在右边。
  XComponent组件作用于EGLOpenGLES和媒体数据写入,并显示在XComponent组件。
  相关资料:https:developer。harmonyos。comcndocsdocumentationdocreferencestsbasiccomponentsxcomponent0000001333800561
  hml代码如下:build(){Flex(){Flex(){Stack(){Flex(){相机显示的组件XComponent({id:componentId,type:surface,controller:this。mXComponentController})。onLoad((){this。mXComponentController。setXComponentSurfaceSize({surfaceWidth:640,surfaceHeight:480})this。surfaceIdthis。mXComponentController。getXComponentSurfaceId()this。initCamera(this。surfaceId)})}。width(800)。height(800)显示在相机上面的组件:拍照和摄像的图标,摄像的时间Flex({direction:FlexDirection。Column,justifyContent:FlexAlign。End,alignItems:ItemAlign。Center}){if(this。photoFlag){拍照Image(r(app。media。takephotonormal))。width(50)。height(50)。onClick((){this。desStr拍照完成this。takePicture()})}Text(this。desStr)。fontColor(red)。height(30)。fontSize(20)}。width(480)。height(480)}。border({width:1,style:BorderStyle。Solid,color:000000})右边的控制button和图片显示区域Flex({direction:FlexDirection。Column,justifyContent:FlexAlign。SpaceBetween,alignItems:ItemAlign。Center,}){Button(选择沙箱路径存储)。onClick((){this。isMediaUrlfalse})。stateStyles({normal:{设置默认情况下的显示样式。backgroundColor(Color。Blue)},pressed:{设置手指摁下时的显示样式。backgroundColor(Color。Pink)}})Image(decodeURI(file:this。imgUrl))。width(480)。height(350)显示沙箱图片Button(选择媒体路径存储)。onClick((){this。isMediaUrltrue})。stateStyles({normal:{设置默认情况下的显示样式。backgroundColor(Color。Blue)},pressed:{设置手指摁下时的显示样式。backgroundColor(Color。Pink)}})Image(decodeURI(this。imgUrl))。width(480)。height(350)显示媒体图片}。width(480)。height(100)。border({width:1,style:BorderStyle。Solid,color:000000})}。border({width:1,style:BorderStyle。Solid,color:red})。width(100)。height(100)}。height(100)。width(100)}
  UI实现了对存储路径的选择,需要存储到沙箱路径还是媒体路径。
  注意:沙箱路径需要加上file:,查看对应的存储路径步骤:打开hdc命令窗口cddataappel2100basecom。chinasoft。photohapsentryfiles进入ls查看全部文件拍照流程初始化相机:这一步需要在拍照前就进行,一般是在XComponent组件的onLoad()中进行的。初始化相机和会话管理asyncinitCamera(surfaceId:number){this。cameraManagerawaitcamera。getCameraManager(globalThis。context)需要在Ability中定义globalThis。cnotallowthis。contextthis。camerasawaitthis。cameraManager。getCameras()this。cameraIdthis。cameras〔1〕。cameraIdawaitthis。photoReceiver()创建图片接收器并进行订阅this。mSurfaceIdawaitthis。mReceiver。getReceivingSurfaceId()this。cameraInputawaitthis。cameraManager。createCameraInput(this。cameraId)this。previewOutputawaitcamera。createPreviewOutput(surfaceId。toString())this。photoOutputawaitcamera。createPhotoOutput(this。mSurfaceId)this。captureSessionawaitcamera。createCaptureSession(globalThis。context)awaitthis。captureSession。beginConfig()awaitthis。captureSession。addInput(this。cameraInput)awaitthis。captureSession。addOutput(this。previewOutput)awaitthis。captureSession。addOutput(this。photoOutput)awaitthis。captureSession。commitConfig()awaitthis。captureSession。start()。then((){console。log(zmw1Promisereturnedtoindicatethesessionstartsuccess。);})}创建图片接收器并进行订阅asyncphotoReceiver(){this。mReceiverimage。createImageReceiver(CameraSize。WIDTH,CameraSize。HEIGHT,4,8)letbuffernewArrayBuffer(4096)this。mReceiver。on(imageArrival,(){console。log(zmwserviceimageArrival)this。mReceiver。readNextImage((err,image){if(errimageundefined){return}image。getComponent(4,(errMsg,img){if(errMsgimgundefined){return}if(img。byteBuffer){bufferimg。byteBuffer}if(this。isMediaUrl){this。savePictureMedia(buffer,image)}else{this。savePictureSand(buffer,image)}})})returnbuffer})}
  如下:根据camera的getCameraManager方法获取CameraManager通过CameraManager获取所有的相机数组,找到可用的相机,并获取相机的cameraid创建图片接收器并进行订阅,获取receiver的surfaceId通过CameraManager的createCameraInput(cameraid)创建相机输入流通过camera的createPreviewOutput(sufaceId)创建相机预览输出流,这里sufaceId为XComponent的id通过camera的createPhotoOutput(sufaceId)创建相机拍照输出流,这里sufaceId为图片接收器的surfaceId会话管理:创建会话,并且配置会话的相机输入流,相机拍照输出流与相机预览流,提交配置,开始会话
  至此,相机就能正常的显示出图像了。用拍照方法拍摄照片:拍摄照片asynctakePicture(){letphotoSettings{rotation:camera。ImageRotation。ROTATION0,quality:camera。QualityLevel。QUALITYLEVELLOW,mirror:false}awaitthis。photoOutput。capture(photoSettings)}
  调用相机的输出流的capture方法进行拍照操作,会触发图片接收器的监听,进行对字节流的写入操作,保存到沙箱或者媒体。保存图片:分为沙箱路径与媒体路径。保存沙箱路径asyncsavePictureSand(buffer:ArrayBuffer,img:image。Image){letinfothis。mediaUtil。getInfoFromType(mediaLibrary。MediaType。IMAGE)letdateTimeUtilnewDateTimeUtil()letname{dateTimeUtil。getDate()}{dateTimeUtil。getTime()}letdisplayName{info。prefix}{name}{info。suffix}letsandboxDirPathglobalThis。context。filesDir;letpathsandboxDirPathdisplayNamethis。imgUrlpathletfdSandawaitfileio。open(path,0o20o100,0o666);awaitfileio。write(fdSand,buffer)awaitfileio。close(fdSand)。then((){this。desStr});awaitimg。release()}保存媒体路径asyncsavePictureMedia(buffer:ArrayBuffer,img:image。Image){this。fileAssetawaitthis。mediaUtil。createAndGetUri(mediaLibrary。MediaType。IMAGE)this。imgUrlthis。fileAsset。uriletfdawaitthis。mediaUtil。getFdPath(this。fileAsset)awaitfileio。write(fd,buffer)awaitthis。fileAsset。close(fd)。then((){this。desStr})awaitimg。release()}
  释放相机:结束释放相机资源asyncreleaseCamera(){if(this。captureSession){awaitthis。captureSession。stop()。then((){})}if(this。cameraInput){awaitthis。cameraInput。release()。then((){})}if(this。previewOutput){awaitthis。previewOutput。release()。then((){})}if(this。photoOutput){awaitthis。photoOutput。release()。then((){})}释放会话if(this。captureSession){awaitthis。captureSession。release((err){if(err){console。error(zmwFailedtoreleasetheCaptureSessioninstance{err。message});return;}});}}
  在完成了相机的调用后,需要对相机的资源进行释放,否则再次调用的时候会一直被占用而导致黑屏。
  总结
  OpenHarmony对于相机的官方使用文档不太清晰,有许多的坑,需要去趟。
  在这个过程中我遇到的问题:在相机的使用时,由于开发板上的相机获取到了两个,一个是外接USB的相机,一个应该是系统的,在获取相机的id的时候需要注意。在保存相机拍照的图片的时候,保存到沙箱路径时显示不到页面上,需要在保存的路径前加上file:。
  需要扩展研究的是进行相机的摄像操作,以及相机拍照与摄像的切换操作。
  参考资料:https:gitee。comopenharmonyappsamplestreemastermediaScanhttps:gitee。comopenharmonyapplicationscamerahttps:gitee。comopenharmonydocsblobOpenHarmony3。2Beta3zhcnapplicationdevmediacamera。md
  作者:张明伟

法律科普邻居噪音纠纷可以起诉吗头条创作挑战赛邻里之间的关系和亲人之间的关系类似,但又和亲人之间的关系有区别。我国法律对亲属关系的规定较为明确,但是对于邻里关系的规定比较模糊。这是因为亲属关系比较好确定,也相对稳同样是母亲专业户,把萨日娜和宋春丽放一起,演技优劣一目了然历年的热播剧王,大多出自央视一套央视八套北京卫视湖南卫视。但每年的超级大爆款,总是非央一和央八莫属。这段时间,两大王牌频道又杠上了,央一我们的日子刚播了一半,央八的情满九道湾也赶紧文旅局长们卷出圈,当地旅游热度上涨了没?近年来,有文旅局长因为短视频意外走红后,全国各地的文旅局长纷纷效仿宣布出战,换装排舞骑马撑伐,使出浑身解数为家乡代言,火出了圈。有网友评论称现在没点才艺,都当不了文旅局局长。新疆伊美国前高官宁把台积电毁掉,都不能让中国大陆夺走在芯片越来越重要的今天,台积电已经严重影响到全球芯片产业链的格局了。毕竟台积电是全球掌握最先进芯片技术的企业,目前达到了3nm,也是全球唯二达到3nm的厂商,另外一家是三星,但三星闰月清明!牢记四不做,老传统和习俗要知晓,家兴人旺!赶紧看!时间过的真快,清明节将至,这是民间最重要的祭祀节日。今年的清明不一般,竟然是闰月的清明。老祖宗认为闰月是非常的不吉利,比十二个月多了一个月,老人们常说闰月地府不开门,先人收不到等。崔茂虎被查!真正的中央大老虎,从政33年,一路晋升,非常顺畅!打老虎拍苍蝇正在进行时,无论是大老虎还是小苍蝇,都统统落马。当官的切莫恋功利,一旦贪欲过高,则玩火自焚。在2023年3月18日,国务院任免国家工作人员,免去崔茂虎的国家宗教事务局局星二代齐聚时装周,中了基因彩票的二代们,谁的颜值能超越爸妈好莱坞明星的子女们纷纷亮相时装周,增加自身影响力,这些中了基因彩票的二代们,谁的颜值能超越爸妈,成为好莱坞颜霸,让我们来拭目以待二月伊始,时装周在世界四大服装之都依次举行。在这大牌奥斯卡红毯上看咱们的大表姐刘雯用飒酷大杀四方在今年的奥斯卡红毯上,各位明星争奇斗艳,一路闪耀。而其中一个亮点就是我们的大表姐刘雯,用她独特的飒酷的风格大杀四方。刘雯一派女王范,深蓝色透视西装,利落的背头盘发,光洁的额头,垂吊谁更耀眼梅根与凯特争抢聚光灯苏塞克斯公爵夫人和威尔士王妃的标志性风格反映了她们截然不同的社会角色。哈里王子的妻子最近在洛杉矶发表声明时穿着低调但昂贵的服装。专家表示,与凯特米德尔顿的服饰相比,梅根马克尔精心挑暗黑纹身这20款真的惊艳!头条创作挑战赛现在很多年轻人都喜欢暗黑纹身,因为它很酷。但是有一些人认为暗黑纹身就是在显示他们的黑恶side。我不同意这个看法。我认为暗黑纹身是一种艺术形式,它可以表达很多酷无畏勇春季半裙2023年这么穿,高级又气质!初春时节小裙子总是最受欢迎的。不同类型的半裙能够让你化身百变女王,轻松应对各种环境。那么今天就来感受一下春天半裙的搭配推荐吧。温柔职业风半裙搭配西装,能够结合西装给人的硬挺感和裙装
岁末年初,小心人员密集场所事故!年终岁首是各类事故特别是重特大事故多发期,节庆活动和群众出行较多。宾馆饭店商场娱乐场所旅游景点等人员密集场所,一旦发生踩踏火灾爆炸等事故,往往造成群死群伤。遇到紧急情况该怎么办呢?10年赴华签证仍有效!3大航司不再经停韩国,直飞中国!自1月8日,中国取消入境隔离后。打算回国探亲的美国华人越来越多。然而,到底10年的签证是否可以使用呢?近日,中国驻美国大使馆在其官网发布信息,1。就目前签证审发安排答记者问指出,疫三星欲回国内市场?晚了!网友学学国内厂商的售后吧!想必大家都有用过三星的手机,曾几何时在中国市场也风光无限,是占据市场份额最高的品牌,就算是苹果也无法撼动其地位,然而这样的市场地位,却一步步被自己给作没了。原因大家应该也清楚,当时胡鑫宇悲剧的发生就是你们的责任一百多天后胡新宇事件终于大白于天下!一位花季少年的离世当然让人心痛不已,这种悲剧的发生,到底谁的责任更大呢?从家长,学校,本人,JC,社会舆论几个方面说一下个人观点。第一家长方面,甘肃省2022年下半年事业单位招考重启公告关于重启甘肃省2022年下半年事业单位公开招聘分类考试笔试工作的公告根据工作安排,经研究,决定重启甘肃省2022年下半年事业单位公开招聘分类考试工作。现就有关事项公告如下一笔试时间日本最大食品企业在华设立的第二家乳制品工厂在天津投产北京日报客户端记者白波位于天津经开区的明治乳业天津工厂1月31日正式投产。这是日本最大的食品企业集团明治控股在中国设立的第二家乳制品生产制造工厂。明治乳业天津工厂拥有9条生产线,将李成北发挥央企优势助力天津经济发展再上新台阶2月1日上午,本市举行重点推介项目首期集中签约仪式。在企业家代表发言环节,中国化学工程第十三建设有限公司党委书记董事长李成北表示,天津提出十项行动,抓住了经济高质量发展的关键,举措涉嫌操纵证券市场,烟花第一股股东被查!此前公司实控人被刑拘2023年春节,烟花话题火热。不过,在绚烂的烟花中,有花炮公司股东却因涉嫌操纵证券市场而被立案调查。红星资本局消息,1月31日晚间,被称为A股烟花第一股的ST熊猫(600599。S关注!2023年退役军人高考加分政策来了近日,教育部印发关于做好2023年普通高校招生工作的通知对2023年普通高校招生工作作出部署根据同步发布的2023年普通高等学校招生工作规定退役军人烈士子女等人员享加分优先录取等优三部门发布跨境电子商务出口退运商品税收政策A股相关概念股拉升央广网北京2月2日消息日前,财政部海关总署税务总局联合发布关于跨境电子商务出口退运商品税收政策的公告(以下简称公告),降低跨境电商企业出口退运成本,积极支持外贸新业态发展。公告规定1岁孩吃下牛奶鸡蛋,却浑身长满小疹子半岛网2月1日讯(记者孙贴静通讯员毕乙贺)吃了鸡蛋后全吐了,怎么一回事?吃完海鲜后,不知怎么回事就长满湿疹这几年,因为食物过敏来青岛妇女儿童医院看病的宝宝越来越多。1岁的悦悦(化名
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网