Android Camera2学习(一)预览

本文介绍使用Android Camera2 API实现相机预览的过程,包括通过CameraManager打开相机、创建相机连接及设置重复预览请求等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据Camera2 API 开启预览总体流程如下

1.通过CameraManager openCamera方法打开相机,并通过onOpened回调拿到CameraDevice对象

2.通过CameraDevice createCaptureSession方法创建一个相机连接

3.相机连接成功创建后通过setRepeatingRequest方法创建一个重复的预览请求

获取CameraManager实例

CameraManager cameraManager =(CameraManager)mContext.getSystemService(Context.CAMERA_SERVICE);

通过openCamera打开相机,onOpened回调相机成功打开

  • openCamera(String cameraId, final CameraDevice.StateCallback callback,Handler handler)

打开相机

Open a connection to a camera with the given ID.

可以看到通过openCamera方法打开相机需要指定对应的cameraId,通过以下方法取得想要cameraId

  • getCameraIdList()

返回一个可用的相机Id列表

  • getCameraCharacteristics(String cameraId) 

根据Id查询对应相机的信息

此处我们打开后置摄像头,完整代码如下:

private void openCamera(Context mContext) {
    CameraManager cameraManager = (CameraManager) mContext.
        getSystemService(Context.CAMERA_SERVICE);
    if (cameraManager == null) {
        return;
    }
    try {
        String[] cameraIds = cameraManager.getCameraIdList();
        for (String id : cameraIds) {
            CameraCharacteristics cameraCharacteristics =
                cameraManager.getCameraCharacteristics(id);
            Integer integer = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
            if (integer != null && CameraCharacteristics.LENS_FACING_BACK == integer) {
                if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                cameraManager.openCamera(id, this, cameraHandler);
            }
        }
    } catch (CameraAccessException e) {
            e.printStackTrace();
    }
}

通过onOpened回调拿到CameraDevice对象

@Override
public void onOpened(@NonNull CameraDevice camera) {
    Log.i(TAG, "onOpened");
    this.camera = camera;
}

createCaptureSession创建一个相机连接,onConfigured回调相机连接成功

//surface 为需要预览的对象
private void createSession(Surface surface){
    try {
        camera.createCaptureSession(Arrays.asList(surface),
                    sessionCallBack, cameraHandler);
    } catch (CameraAccessException e) {
            e.printStackTrace();
    }
}

相机连接成功创建后创建一个重复的预览请求

@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
    Log.i(TAG, "onConfigured");
    cameraSession = session;
    try {
        CaptureRequest.Builder previewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        previewBuilder.addTarget(previewSurface);
        previewBuilder.addTarget(imageReader.getSurface());
        previewRequest = previewBuilder.build();
        cameraSession.setRepeatingRequest(previewRequest, captureCallback, cameraHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

到此为止,已可通过camera2 API成功的开启预览。

最后退出预览并关闭相机

@Override
public void close() {
    try {
        if (cameraSession != null) {
            cameraSession.stopRepeating();
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    if (camera != null) {
        camera.close();
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值