我们使用TextureView显示相机预览数据,Camera2的预览和拍照数据都是使用CameraCaptureSession会话来请求的
private void startPreview() {
SurfaceTexture mSurfaceTexture = mTextureView.getSurfaceTexture();
mSurfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
//通过view创建surface对象
Surface previewSurface = new Surface(mSurfaceTexture);
try {
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//绑定请求和surface
mCaptureRequestBuilder.addTarget(previewSurface);
//预览数据会同时输出到previewSurface和mImageReader
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, mImageReader.getSurface()), new
CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
try {
//创建请求
mCaptureRequest = mCaptureRequestBuilder.build();
//保存相机会话对象
mCameraCaptureSession = session;
//开始预览
mCameraCaptureSession.setRepeatingRequest(mCaptureRequest, null, mCameraHandler);
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
}, mCameraHandler);
}
}
createCaptureRequest阶段
alps/frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
public CaptureRequest.Builder createCaptureRequest(int templateType) {
synchronized(mInterfaceLock) {
CameraMetadataNative templatedRequest = null;
templatedRequest = mRemoteDevice.createDefaultRequest(templateType);//创建default metadata
// If app target SDK is older than O, or it's not a still capture template, enableZsl
// must be false in the default request.
if (mAppTargetSdkVersion < Build.VERSION_CODES.O ||
templateType != TEMPLATE_STILL_CAPTURE) {
overrideEnableZsl(templatedRequest, false);
}
CaptureRequest.Builder builder = new CaptureRequest.Builder(
templatedRequest, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE,
getId(), /*physicalCa