При работе с высокопроизводительным устройством (например: разрешение 4032 * 3024) с ОС 7.0 и выше. При создании сеанса в createCaptureSession вызывает onConfigureFailed.
В LogCat это показывает:
E / CameraCaptureSession: Session 1: Не удалось создать сеанс захвата; Ошибка конфигурации
private void takePicture() {
if (cameraDevice == null)
return;
//getSystemService() --> Return the handle to a system-level service by name. The class of the returned object varies by the requested name.
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId());
Size[] jpegSizes = null;
if (characteristics != null)
jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
.getOutputSizes(ImageFormat.JPEG);
//capture image with custom size
int height = 480;
int width = 640;
if (jpegSizes != null && jpegSizes.length > 0) {
Log.d(TAG,"JPEG SIZE "+jpegSizes[0].getWidth() +" "+jpegSizes[0].getHeight());
width = jpegSizes[0].getWidth();
height = jpegSizes[0].getHeight();
}
final ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
captureRequestBuilder.set(CaptureRequest.JPEG_QUALITY,(byte) 100);
List<Surface> outputSurface = new ArrayList<>(2);
outputSurface.add(reader.getSurface());
outputSurface.add(new Surface(textureView.getSurfaceTexture()));
final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(reader.getSurface());
captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
//check orientation base on device
int rotation = getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
cameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
try {
session.capture(captureBuilder.build(), captureListener, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Toast.makeText(MainActivity.this,"sorry",Toast.LENGTH_SHORT).show();
}
}, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}