Capture 拍照 报错
java.lang.IllegalArgumentException: AndroidRuntime:
java.lang.IllegalArgumentException: CaptureRequest contains unconfigured
Input/Output Surface!
//创建CameraCaptureSession 的方法
public void startPreview() {
//设置SurfaceTexture的默认尺寸
mSurfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
//根据mSurfaceTexture创建Surface
Surface mSurface = new Surface(mSurfaceTexture);
try {
//创建preview捕获请求
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//将此请求输出目标设为我们创建的Surface对象,这个Surface对象也必须添加给createCaptureSession才行
mCaptureRequestBuilder.addTarget(mSurface);
// mCaptureRequestBuilder.addTarget(mImageReader.getSurface());
//创建捕获会话,第一个参数是捕获数据的输出Surface列表,
//第二个参数是CameraCaptureSession的状态回调接口,当它创建好后会回调onConfigured方法,
//第三个参数用来确定Callback在哪个线程执行,为null的话就在当前线程执行
mCameraDevice.createCaptureSession(Arrays.asList(mSurface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
mCaptureRequest = mCaptureRequestBuilder.build();
mCameraCaptureSession = session;
mCameraCaptureSession.setRepeatingRequest(mCaptureRequest, null, mCameraHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
}, mCameraHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
//拍照
private void capture() {
try {
// mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// mCaptureRequestBuilder.addTarget(surface);
// mSurfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// Surface surface = new Surface(mSurfaceTexture);
final CaptureRequest.Builder mCaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
// mCaptureBuilder.addTarget(mSurface);
mCaptureBuilder.addTarget(mImageReader.getSurface());
mCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATION.get(rotation));
CameraCaptureSession.CaptureCallback CaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
Toast.makeText(getApplicationContext(), "Image Saved!", Toast.LENGTH_SHORT).show();
unLockFocus();
}
};
// mCameraCaptureSession.stopRepeating();
mCameraCaptureSession.capture(mCaptureBuilder.build(), CaptureCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
Log.e(TAG, "CameraAccessException:" + e);
}
}
解决方案
在创建的时候 如图所示 要将mImageReader.getSurface() 加上!