当前位置: 首页 > 科技观察

HarmonyOS摄像头的基本使用实践_0

时间:2023-03-12 01:21:47 科技观察

了解更多请访问:与华为官方共建的Harmonyos技术社区https://harmonyos.51cto.com摄像头开发流程摄像头权限申请config.json"reqPermissions":[{"name":"ohos.permission.CAMERA"},{"name":"ohos.permission.WRITE_MEDIA"},{"name":"ohos.permission.MICROPHONE"},{"name":"ohos.permission.MEDIA_LOCATION"}]MainAbility@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());requestPermissions();}privatevoidrequestPermissions(){String[]permissions={SystemPermission.CAMERA,SystemPermission.MICROPHONE,SystemPermission.MEDIA_LOCATION,SystemPermission.WRITE_MEDIA};ListpermissionFiltered=Arrays.stream(permissions).filter(permission->verifySelfPermission(permission)!=IBundleManager.PERMISSION_GRANTED(Collect).collecttoList());requestPermissionsFromUser(permissionFiltered.toArray(newString[permissionFiltered.size()]),0);}@OverridepublicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){if(permissions==null||permissions.length==0||grantResults==null||grantResults.length==0){return;}为(intgrantResult:grantResults){if(grantResult!=IBundleManager.PERMISSION_GRANTED){terminateAbility();break;}}}在相机设备创建布局文件上添加按钮:按钮逻辑代码:privatevoidcreateCameraBtnFunc(Componentcomponent){//openCamera();//首先测试camera的创建initSurface();//创建surface,其中包含openCamera()}privatevoidopenCamera(){System.out.println("createCameraBtnFuncstart...");CameraKitcameraKit=CameraKit.getInstance(getContext());if(cameraKit==null){System.out.println("cameraKitcreateerror!");}System.out.println("cameraKitcreatesuccess!"+cameraKit);try{//获取当前设备的逻辑相机列表String[]cameraIds=cameraKit.getCameraIds();if(cameraIds.length<=0){System.out.println("cameraIdssizeis0");}System.out.println("Logicalcameraids:"+Arrays.toString(cameraIds));//第一个参数cameraId//第二个和第三个参数负责相机创建和相机运行时数据和状态检测cameraKit.createCamera(cameraIds[0],newCameraStateCallbackImpl(),newEventHandler(EventRunner.create("CameraCb")));}catch(IllegalStateExceptione){//异常处理}}privateclassCameraStateCallbackImplextendsCameraStateCallback{@OverridepublicvoidonCreated){Cameracam//相机创建成功回调}@OverridepublicvoidonConfigured(Cameracamera){}}至此,创建摄像头设备已经完成,执行成功意味着摄像头系统的硬件已经上电相机设备创建成功后,会在CameraStateCallback中触发onCreated(Cameracamera)回调,带回Camera对象对相机设备进行操作。当一个新的摄像头设备创建成功后,首先需要对摄像头进行配置,调用configure(CameraConfig)方法实现配置。摄像头设备配置摄像头配置主要是设置预览、拍照、录像需要的Surface(ohos.agp.graphics.Surface)。如果未配置Surface,则无法使用相应的功能。为了检测相机帧捕获结果的数据和状态,有时需要在相机配置时调用setFrameStateCallback(FrameStateCallback,EventHandler)方法设置帧回调。相机配置成功后,会在CameraStateCallback中触发onConfigured(Cameracamera)回调,然后可以进行相机帧捕获相关的操作。对于相机配置,在layout文件中添加layout:逻辑代码:privateSurfaceProvidersurfaceProvider;privateDirectionalLayoutsurfaceContainer;//定义在最前面privatevoidinitSurface(){getWindow().setTransparent(true);DirectionalLayout.LayoutConfigparams=newDirectionalLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,ComponentContainer.LayoutConfig.MATCH_PARENT);surfaceProvider=newSurfaceProvider(this);surfaceProvider.setLayoutConfig(params);surfaceProvider.pinToZTop(false);surfaceProvider.getSurfaceOps().get().addCallback(newSurfaceCallBack());surfaceContainer.addComponent(surfaceProvider);}privateclassSurfaceCallBackimplementsSurfaceOps.Callback{@OverridepublicvoidsurfaceCreated(SurfaceOpscallbackCrefaceSurfacesOps可以创建相机对象){/执行initSurface();openCamera();}@OverridepublicvoidsurfaceChanged(SurfaceOpscallbackSurfaceOps,intformat,intwidth,我点击按钮后ntheight){}@OverridepublicvoidsurfaceDestroyed(SurfaceOpscallbackSurfaceOps){}}//在上面的CameraStateCallbackImpl的onCreated方法中添加代码privateCameracameraDevice;privateSurfacepreviewSurface;privateCameraConfig.BuildercameraConfigBuilder;//放前面privatefinalclassCameraStateCallbackImplextendsCameraStateCallback{@OverridepublicvoidonCreated(Cameracamera){//创建相机成功的回调cameraDevice=camera;previewSurface=surfaceProvider.getSurfaceOps().get().getSurface();cameraConfigBuilder=camera.getCameraConfigBuilder();if(cameraConfigBuilder==null){System.out.println("onCreatedcameraConfigBuilderisnull");return;}//SurfacecameraConfigBuilder.addSurface(previewSurface)配置预览;//配置帧结果的回调cameraConfigBuilder.setFrameStateCallback(frameStateCallbackImpl,newEventHandler(EventRunner.create()));try{//相机设备配置camera.configure(cameraConfigBuilder.build());}catch(IllegalArgumentExceptione){System.out.println("ArgumentException");}catch(IllegalStateExceptione){System.out.println("StateException");}}}privateFrameStateCallbackframeStateCallbackImpl=newFrameStateCallback(){//...更多需要实现接口中的方法};配置完成后,会回调publicvoidonConfigured(Cameracamera)方法,在该方法中Lipuhuocamera捕获的FramesCameraframecapture用户在执行拍照或其他功能之前,一般会看到预览画面,所以对于一个普通的相机应用,预览必不可少。通过getFrameConfigBuilder(FRAME_CONFIG_PREVIEW)方法获取预览配置模板。更多框架配置项和详细使用方法,请参考API接口说明的FrameConfig.Builder部分。通过triggerLoopingCapture(FrameConfig)方法实现循环帧捕获实现预览://在CameraStateCallbackImpl的onConfigured添加代码privateFrameConfig.BuilderframeConfigBuilder;privateFrameConfigpreviewFrameConfig;privatefinalclassCameraStateCallbackImplextendsCameraStateCallback{@OverridepublicvoidonConfigured(Cameracamera){//配置成功的时候回调//获取预览配置模板frameConfigBuilder=camera.getFrameConfigBuilder(Camera.FrameConfigType.FRAME_CONFIG_PREVIEW);//ConfigurationpreviewSurfaceframeConfigBuilder.addSurface(previewSurface);previewFrameConfig=frameConfigBuilder.build();try{//StartloopframecaptureinttriggerId=camera.triggerLoopingCapture(preview;FrameConfig)IllegalArgumentExceptione){System.out.println("ArgumentException");}catch(IllegalStateExceptione){System.out.println("StateException");}}}Aftertheaboveoperations,thecameraapplicationcanalreadyperformreal-timepreviewnormally.Inthepreviewstate,developerscanalsoperformotheroperations.Forexample,whenthepreviewframeconfigurationchanges,thepreviewframeconfigurationcanbeupdatedthroughthetriggerLoopingCapture(FrameConfig)method.privatevoidreleaseCameraBtnFunc(Componentcomponent){if(cameraDevice!=null){//关闭相机并释放资源cameraDevice.release();cameraDevice=null;}//预览配置模板空previewFrameConfig=null;}最终效果:想要了解更多信息请访问:https://harmonyos.51cto.com,与华为合作搭建的鸿蒙技术社区