上篇已经分析了CameraService 的初始化过程,之前分析到ICameraService.connectDevice(…), 通过CameraService建立起cameraID 与CameraDevice的联系,那我们继续往下分析, CameraPreview创建的过程:
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,当成一个preview的一个buffer数据
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.
//把surface 和 mImageReader的buffer 当成preview的一个surface 的集合
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
...
}
}
public void createCaptureSession(List<Surface> outputs,
CameraCaptureSession.StateCallback callback, Handler handler)
throws CameraAccessException {
List<OutputConfiguration> outConfigurations = new ArrayList<>(outputs.size());
//将之前的surface集合 转化成OutputConfiguration的集合
for (Surface surface : outputs) {
outConfigurations.add(new OutputConfiguration(surface));
}
//根据OutputConfiguration集合, 再来创建captureSession
createCaptureSessionInternal(null, outConfigurations, callback,
checkAndWrapHandler(handler), /*operatingMode*/ICameraDeviceUser.NORMAL_MODE,
/*sessionParams*/ null);
}
private void createCaptureSessionInternal(InputConfiguration inputConfig,
List<OutputConfiguration>