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