一步一步解析google camera2 demo(三)

版权声明:本文为博主原创文章,转载请注明出处 http://blog.csdn.net/u013961718 https://blog.csdn.net/u013961718/article/details/88116031

目录:
一、Camera2关键类解析
二、打开相机
三、预览
四、拍照

三、预览

1、openCamera后,会响应CameraDevice.StateCallback的onOpened回调,拿到device,如下:

/**
 * {@link CameraDevice.StateCallback} is called when {@link CameraDevice} changes its state.
 */
private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {

	@Override
	public void onOpened(@NonNull CameraDevice cameraDevice) {
		Log.i(TAG, "onOpened thread = " + android.os.Process.myTid());
		// This method is called when the camera is opened.  We start camera preview here.
		mCameraOpenCloseLock.release();
		mCameraDevice = cameraDevice;
		createCameraPreviewSession();
	}

	@Override
	public void onDisconnected(@NonNull CameraDevice cameraDevice) {
		mCameraOpenCloseLock.release();
		cameraDevice.close();
		mCameraDevice = null;
	}

	@Override
	public void onError(@NonNull CameraDevice cameraDevice, int error) {
		mCameraOpenCloseLock.release();
		cameraDevice.close();
		mCameraDevice = null;
		Activity activity = getActivity();
		if (null != activity) {
			activity.finish();
		}
	}

};

2、开始创建session,调用createCameraPreviewSession() :

/**
 * Creates a new {@link CameraCaptureSession} for camera preview.
 */
private void createCameraPreviewSession() {
	try {
		SurfaceTexture texture = mTextureView.getSurfaceTexture();
		assert texture != null;

		// We configure the size of default buffer to be the size of camera preview we want.
		texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

		// This is the output Surface we need to start preview.
		Surface surface = new Surface(texture);

		// We set up a CaptureRequest.Builder with the output Surface.
		mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
		mPreviewRequestBuilder.addTarget(surface);

		// Here, we create a CameraCaptureSession for camera preview.
		mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
				new CameraCaptureSession.StateCallback() {

					@Override
					public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
						// The camera is already closed
						if (null == mCameraDevice) {
							return;
						}

						// When the session is ready, we start displaying the preview.
						mCaptureSession = cameraCaptureSession;
						try {
							// Auto focus should be continuous for camera preview.
							mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
									CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
							// Flash is automatically enabled when necessary.
							setAutoFlash(mPreviewRequestBuilder);

							// Finally, we start displaying the camera preview.
							mPreviewRequest = mPreviewRequestBuilder.build();
							mCaptureSession.setRepeatingRequest(mPreviewRequest,
									mCaptureCallback, mBackgroundHandler);
						} catch (CameraAccessException e) {
							e.printStackTrace();
						}
					}

					@Override
					public void onConfigureFailed(
							@NonNull CameraCaptureSession cameraCaptureSession) {
						showToast("Failed");
					}
				}, null
		);
	} catch (CameraAccessException e) {
		e.printStackTrace();
	}
}

上述代码流程也非常简洁:
(1) 根据SurfaceTexture配置Surface,用于显示预览画面。
(2) 使用Surface创建session。
(3) 创建preview的request。
(4) 通过setRepeatingRequest将preview request submit到框架,开启预览。

猜你喜欢

转载自blog.csdn.net/u013961718/article/details/88116031
今日推荐