文章插图
在上一篇文章中,我们实现“获取相机的权限ohos.permission.CAMERA”之后,紧接着要让手机的屏幕开启拍摄外部环境的画面,其拍摄预览的画面也必须是后置摄像头所拍摄的画面 。
如果你感觉开启拍摄画面的功能实现比较复杂,我建议你最好是参考一下HarmonyOS Developer的相关文档内容,可根据“开发->媒体->相机”目录下的“相机开发指导”中的界面内容进行其功能的梳理 。
依据上图中的相机开发流程,华为手机的后置摄像头想要开启拍摄的预览画面,我们必须要创建相机设备这个对象,为了更直观更简洁的方便你们去实现此功能,我还是按照自己的项目结构呈现相关代码内容 。
一.在项目中新建一个CameraView类继承DirectionalLayout,单独代表相机这个视图对象,并实现相机设备的创建 。项目结构图,如下:
代码内容,如下:
import ohos.agp.components.ComponentContainer;import ohos.agp.components.DirectionalLayout;import ohos.agp.components.surfaceprovider.SurfaceProvider;import ohos.agp.graphics.Surface;import ohos.agp.graphics.SurfaceOps;import ohos.agp.window.service.WindowManager;import ohos.app.Context;import ohos.eventhandler.EventHandler;import ohos.eventhandler.EventRunner;import ohos.hiviewdfx.HiLog;import ohos.hiviewdfx.HiLogLabel;import ohos.media.camera.CameraKit;import ohos.media.camera.device.Camera;import ohos.media.camera.device.CameraConfig;import ohos.media.camera.device.CameraStateCallback;import ohos.media.camera.device.FrameConfig;import static ohos.media.camera.device.Camera.FrameConfigType.FRAME_CONFIG_PREVIEW;public class CameraView extends DirectionalLayout{static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00311, "MY_TAG");//相机设备private Camera cameraSurface;//相机预览模版的配置对象private SurfaceProvider surfaceProvider;//相机预览模版private Surface previewSurface;//上下文private Context context;//摄像头类型:前置摄像头,后置摄像头private String cameraId ;//执行回调private EventHandler eventHandler = new EventHandler(EventRunner.current()) {};private ComponentContainer componentContainer;// 加载相机视图public CameraView(Context context) {super(context);this.context = context;initSurface(context);}//第一步:初始化照相机预览画面的SurfaceProviderprivate void initSurface(Context context){WindowManager.getInstance().getTopWindow().get().setTransparent(true);DirectionalLayout.LayoutConfig params = new DirectionalLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,ComponentContainer.LayoutConfig.MATCH_PARENT);surfaceProvider = new SurfaceProvider(context);surfaceProvider.setLayoutConfig(params);surfaceProvider.pinToZTop(false);surfaceProvider.getSurfaceOps().get().addCallback(new SurfaceCallBack());addComponent(surfaceProvider);}//第二步:创建Surface的监听器SurfaceCallBack,正常感知SurfaceProvider的创建、改变或销毁private class SurfaceCallBack implements SurfaceOps.Callback{@Overridepublic void surfaceCreated(SurfaceOps surfaceOps) {//初始化相机initCamera();}@Overridepublic void surfaceChanged(SurfaceOps surfaceOps, int i, int i1, int i2) {}@Overridepublic void surfaceDestroyed(SurfaceOps surfaceOps) {}}//第三步:设备创建-根据摄像头类型创建相机设备对象private void initCamera(){CameraKit cameraKit = CameraKit.getInstance(context);String[] cameraList = cameraKit.getCameraIds();if(cameraList.length > 1) {//摄像头类型:后置摄像头cameraId = cameraList[0];}CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl();cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler);}//第四步:相机回调-通过回调触发并带回Camera对象,执行相机设备的操作private class CameraStateCallbackImpl extends CameraStateCallback{//创建相机设备@Overridepublic void onCreated(Camera camera) {previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();if(previewSurface == null){return;}CameraConfig.Builder builder = camera.getCameraConfigBuilder();builder.addSurface(previewSurface);camera.configure(builder.build());cameraSurface = camera;}//配置相机设备@Overridepublic void onConfigured(Camera camera) {FrameConfig.Builder builder = camera.getFrameConfigBuilder(FRAME_CONFIG_PREVIEW);builder.addSurface(previewSurface);camera.triggerLoopingCapture(builder.build());}@Overridepublic void onReleased(Camera camera) {super.onReleased(camera);}}//第五步:释放相机-关闭相机相关资源private void releaseCamera(){if (cameraSurface != null){cameraSurface.release();}}}
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:
- 将手机摄像头用作网络摄像头的拍摄效果 手机摄像头当网络摄像头
- 什么是网络摄像头 什么是网络摄像头?
- 华为畅连通话在哪里开启 华为畅连通话在哪打开
- 电脑摄像头打不开怎么回事 笔记本电脑摄像头打不开怎么回事
- 那一年我十六岁 那一年我十六岁,命中注定,开启爱止于痛
- DNF单人卢克模式副本介绍 单人卢克模式怎么开启
- 苹果手机怎么开启录屏功能 苹果手机录屏功能在哪里
- Macbook电脑的手势工具,一键同时开启多个应用
- 三 微信安全知识:如何开启微信支付的6层安全防火墙
- 解答定时免打扰为什么不在设定时间启动 免打扰定时开启无效