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

目录:
一、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到框架,开启预览。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: camera2demo是一个Android应用程序演示示例,用于演示如何使用Android相机2 API拍摄照片和录制视频。camera2demo具有用户界面,可以启用相机,选择不同的摄像头(前置或后置),调整预览尺寸,并拍摄照片或录制视频。 该示例应用程序展示了如何使用CameraManager类来获取可用的相机设备列表,并使用CameraCharacteristics类获取相机特性,如支持的预览尺寸和拍摄模式等。它还使用了TextureView来作为相机预览的界面元素,并使用了CaptureRequest和CaptureSession类来捕获照片和录制视频。 camera2demo还包括一些基本功能,如闪光灯控制,自动对焦和曝光控制。它允许用户通过点击屏幕来拍摄照片,并通过长按来录制视频。它还提供了一些额外的设置选项,如预览比例和对焦模式的调整。 使用camera2demo可以帮助开发人员学习如何使用Android相机2 API来构建自己的相机应用程序。它提供了一个简单易懂的示例,展示了相机2 API的核心概念和功能。通过阅读和理解camera2demo的源代码,开发人员可以更好地了解相机2 API的用法,并根据自己的需求进行扩展和定制。 ### 回答2: Camera2Demo是一个示例程序,用于展示Android相机API的使用方法。相机API是Android系统提供的一组功能强大的相机控制接口,它允许开发者在应用程序中直接访问设备的相机硬件,并实现各种相机功能。 Camera2Demo的主要目的是帮助开发者理解和学习如何使用相机API来实现自定义相机功能。它展示了如何打开相机、设置相机参数、捕获图像和预览以及处理回调等基本操作。通过查看和理解Camera2Demo的源代码,开发者可以学习到如何使用不同的相机功能,如自动对焦、曝光控制、白平衡调节等。 Camera2Demo中还展示了如何处理相机相关的权限请求和运行时权限申请。由于相机属于敏感权限,需要在应用程序中进行权限管理,以确保用户的个人隐私和数据安全。 除了基本的相机操作外,Camera2Demo还演示了如何实现高级的相机功能,例如拍摄连续照片、录制视频、拍摄RAW图像等。通过学习和运行Camera2Demo,开发者可以了解如何利用相机API来应对各种不同的需求和场景。 总之,Camera2Demo是一个有价值的示例程序,对于那些想要开发自定义相机功能的Android开发者来说,它提供了一个很好的起点和参考。 ### 回答3: camera2demo 是一个 Android 相机应用程序的示例代码。它是基于 Android Camera2 API 开发的,Camera2 API 是 Android 系统中用于访问和控制相机硬件功能的官方 API。相比较于过时的 Camera API,Camera2 API 提供了更丰富、更灵活的相机功能,并且性能更好。 camera2demo 的主要功能是通过调用 Camera2 API 实现相机的打开、预览、拍照和录像等操作。它展示了如何创建一个相机预览界面,如何自动对焦和曝光,如何设置不同的相机参数,以及如何捕获静态图片和录制视频等。 camera2demo 的示例代码是一个完整的 Android 应用程序,你可以直接运行在支持 Camera2 API 的设备上。通过阅读和学习这个示例代码,你可以了解和掌握 Camera2 API 的使用方法和原理,从而在自己的应用程序中实现更高级和更个性化的相机功能。 总之,camera2demo 提供了一个很好的学习资源,帮助开发者理解和使用 Android Camera2 API。通过充分利用 Camera2 API 的强大功能,开发者可以开发出更好的相机应用程序,提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值