鸿蒙相机预览开发操作
复制以下代码:在想使用相机预览的地方直接这样使用就可以预览了,前提是添加足够的权限
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(); } }}