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


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

文章插图
在上一篇文章中,我们实现“获取相机的权限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();}}}
二.在MainAbilitySlice中创建相机CameraView的布局,加载其拍摄的预览界面 。import com.saomiao.camera.view.CameraView;import ohos.aafwk.ability.AbilitySlice;import ohos.aafwk.content.Intent;import ohos.agp.components.ComponentContainer;import ohos.agp.components.DirectionalLayout;import ohos.agp.window.dialog.ToastDialog;import ohos.bundle.IBundleManager;public class MainAbilitySlice extends AbilitySlice {public static final int MY_PERMISSIONS_REQUEST_CAMERA = 1039;private CameraView cameraView;@Overridepublic void onStart(Intent intent) {super.onStart(intent);// super.setUIContent(ResourceTable.Layout_ability_main);requestCameraPermission();}//1.获取相机权限public void requestCameraPermission(){if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {// 应用未被授予权限if (canRequestPermission("ohos.permission.CAMERA")) {// 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)requestPermissionsFromUser(new String[] { "ohos.permission.CAMERA" } , MY_PERMISSIONS_REQUEST_CAMERA);} else {// 显示应用需要权限的理由,提示用户进入设置授权new ToastDialog(getContext()).setText("请进入手机系统【设置】中,重新开启应用的相机权限").show();}} else {// 权限已被授予new ToastDialog(getContext()).setText("已授权,可使用相机的拍摄功能").show();//成功进入相机拍摄的预览界面initCameraView();}}private void initCameraView(){cameraView = new CameraView(this);DirectionalLayout.LayoutConfig params = new DirectionalLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,ComponentContainer.LayoutConfig.MATCH_PARENT);cameraView.setLayoutConfig(params);super.setUIContent(cameraView);}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}}
三.手机USB数据线连接电脑端,进行真机测试,打开项目的APP查看相机的后置摄像头是否让屏幕出现拍摄画面 。如上图所示,若项目APP的界面打开之后,其预览界面能正常显示出所拍摄的事物,则表示手机后置摄像头已经可以进行正常拍摄 。
结语:我们手机的扫码功能-“扫一扫”,其扫码区域的范围仍处于手机后置摄像头所拍摄的区域,必须要开启手机的拍摄画面才行 。只有开启手机的拍摄画面,我们才能在后面通过扫描功能来捕获拍摄画面中的条形码、二维码等图片信息 。
本篇内容,由于存在回调函数Callback的多次使用,初学者需要参考HarmonyOS官方相应的文档才能更加熟悉 。以上所有的代码块我自己已经测试成功,请你们在成功获取相机权限之后再进行本篇代码内容的添加和功能测试、优化 。
【开启后置摄像头的预览界面 摄像头视频预览怎么开启】


    以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

    「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: