开启后置摄像头的预览界面 摄像头视频预览怎么开启


开启后置摄像头的预览界面 摄像头视频预览怎么开启

文章插图
在上一篇文章中,我们实现“获取相机的权限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小编还为您精选了以下内容,希望对您有所帮助: