> 文档中心 > 鸿蒙相机预览开发操作

鸿蒙相机预览开发操作

复制以下代码:在想使用相机预览的地方直接这样使用就可以预览了,前提是添加足够的权限

 MCamera mCamera = new MCamera(getContext()); //预览容器 Component previewContainer = findComponentById(ResourceTable.Id_"布局ID"); mCamera.open(previewContainer);

权限列表:

    "reqPermissions": [      { "name": "ohos.permission.CAMERA"      },      { "name": "ohos.permission.WRITE_USER_STORAGE"      },      { "name": "ohos.permission.READ_USER_STORAGE"      },      { "name": "ohos.permission.MICROPHONE"      },      { "name": "ohos.permission.LOCATION"      }    ]

import ohos.agp.components.Component;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 MCamera {    private static final String TAG = MCamera.class.getSimpleName();    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG);    private SurfaceProvider surfaceProvider;    private Surface previewSurface;    private Camera cameraDevice;    private ComponentContainer surfaceContainer;    private EventHandler eventHandler = new EventHandler(EventRunner.current()) {    };    private Context context;    public MCamera(Context context) { this.context = context;    }    //打开相机传入一个想要放置预览图像的一个容器    public void open(Component component) { initComponents(component); initSurface();    }    //第一步:初始化一个承载SurfaceProvider的容器    private void initComponents(Component component) { surfaceContainer = (ComponentContainer) component;    }    //第二步:初始话承载照相机预览画面的SurfaceProvider    private void initSurface() { 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()); surfaceContainer.addComponent(surfaceProvider);    } //第三步:初始化一个相机    private void initCamera() { CameraKit cameraKit = CameraKit.getInstance(context); //生成一个可用相机的id String[] cameraList = cameraKit.getCameraIds(); String cameraId = cameraList.length > 1 ? cameraList[1] : cameraList[0]; CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl(); cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler);    }    //第四步:创建相机时候的回调通知类    private class CameraStateCallbackImpl extends CameraStateCallback { CameraStateCallbackImpl() { } @Override public void onCreated(Camera camera) {     //创建相机     System.out.printf("创建相机");     //获取预览Surface     previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();     if (previewSurface == null) {  HiLog.error(LABEL_LOG, "%{public}s", "Create camera filed, preview surface is null");  return;     }     CameraConfig.Builder cameraConfigBuilder = camera.getCameraConfigBuilder();     //添加预览相机--这一步是预览界面     cameraConfigBuilder.addSurface(previewSurface);     camera.configure(cameraConfigBuilder.build());     cameraDevice = camera; } @Override public void onConfigured(Camera camera) {     System.out.printf("配置相机");     FrameConfig.Builder framePreviewConfigBuilder = camera.getFrameConfigBuilder(FRAME_CONFIG_PREVIEW);     framePreviewConfigBuilder.addSurface(previewSurface);     camera.triggerLoopingCapture(framePreviewConfigBuilder.build()); } @Override public void onReleased(Camera camera) {     System.out.printf("释放相机");     super.onReleased(camera); }    }    private class SurfaceCallBack implements SurfaceOps.Callback { @Override public void surfaceCreated(SurfaceOps callbackSurfaceOps) {     //初始化相机     initCamera(); } @Override public void surfaceChanged(SurfaceOps callbackSurfaceOps, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceOps callbackSurfaceOps) { }    }    //释放相机    private void releaseCamera() { if (cameraDevice != null) {     cameraDevice.release(); }    }}