Не удается захватить изображение с помощью camera2 api - PullRequest
1 голос
/ 01 июля 2019

При работе с высокопроизводительным устройством (например: разрешение 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();
    }
}
...