根据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();
}
}