Android 9: сохранение двух изображений с физических линз примерно одновременно - PullRequest
0 голосов
/ 08 марта 2019

В настоящее время я занимаюсь разработкой приложения, которое отображает все физические линзы логической камеры со смартфона.Моя проблема сейчас заключается в том, что когда пользователь нажимает кнопку «захват», я хочу сохранить изображения с каждого физического объектива в лучшем случае сразу.В настоящее время я получаю только одну фотографию, которая получается из первой или "основной" физической линзы.Это мой код для отображения двух физических линз (который работает нормально) и моя попытка сохранить изображения.

  1. textureNormal и textureWide - это мои textureViews для предварительного просмотра камеры
  2. mPhysicalCameraIdNormal и mPhysicalCameraIdWide - мои phyiscalCameraIds
  3. И в настоящее время одно и то же изображение сохраняется дваждыЧитатель ImageReaderNormal и ридерWide.

private void createCameraPreview() {</p>

<code>    try {
        List<OutputConfiguration> outputConfigurations;

        SurfaceTexture textureNormal = viewNormal.getSurfaceTexture();
        SurfaceTexture textureWide = viewWide.getSurfaceTexture();
        assert textureNormal != null && textureWide != null;

        textureNormal.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        textureWide.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

        Surface surfaceNormal = new Surface(textureNormal);
        Surface surfaceWide = new Surface(textureWide);

        captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.addTarget(surfaceWide);
        captureRequestBuilder.addTarget(surfaceNormal);

        OutputConfiguration outputConfigurationPhysicalNormal = new OutputConfiguration(surfaceNormal);
        outputConfigurationPhysicalNormal.setPhysicalCameraId(mPhysicalCameraIdNormal);

        OutputConfiguration outputConfigurationPhysicalWide = new OutputConfiguration(surfaceWide);
        outputConfigurationPhysicalWide.setPhysicalCameraId(mPhysicalCameraIdWide);

        outputConfigurations = new LinkedList<>();
        outputConfigurations.add(outputConfigurationPhysicalWide);
        outputConfigurations.add(outputConfigurationPhysicalNormal);


        SessionConfiguration sessionConfiguration = new SessionConfiguration(
                SessionConfiguration.SESSION_REGULAR, outputConfigurations, AsyncTask.THREAD_POOL_EXECUTOR, new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                if (mCameraDevice == null)
                    return;
                cameraCaptureSessions = session;
                updatePreview();
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                Log.e("---------------", "Failed to configure CameraCaptureSession");
            }
        });

        mCameraDevice.createCaptureSession(sessionConfiguration);

    } catch (CameraAccessException e) {
        e.printStackTrace();
    }

}

private void updatePreview() {
    if(mCameraDevice == null) {
        Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
    } else {

        captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);

        try {
            cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
}

private void takeImage() {
    if(mCameraDevice == null)
        return;
    try{
        CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(mCameraId);
        Size[] jpegSizes = null;
        if(characteristics != null)
            jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
                    .getOutputSizes(ImageFormat.JPEG);

        //Capture image with custom size
        int width = 640;
        int height = 480;
        if(jpegSizes != null && jpegSizes.length > 0)
        {
            width = jpegSizes[0].getWidth();
            height = jpegSizes[0].getHeight();
        }

        final ImageReader readerNormal = ImageReader.newInstance(width, height, ImageFormat.JPEG, 2);
        final ImageReader readerWide = ImageReader.newInstance(width, height, ImageFormat.JPEG, 2);


        List<Surface> outputSurface = new ArrayList<>();
        outputSurface.add(readerWide.getSurface());
        outputSurface.add(readerNormal.getSurface());

        final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
        captureBuilder.addTarget(readerWide.getSurface());
        captureBuilder.addTarget(readerNormal.getSurface());
        captureBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);


        fileNormal = new File(Environment.getExternalStorageDirectory()+"/"+UUID.randomUUID().toString()+"erstes.jpg");
        fileWide = new File(Environment.getExternalStorageDirectory()+"/"+UUID.randomUUID().toString()+"zweites.jpg");

        ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader imageReader) {
                Image image = null;
                try{
                    image = imageReader.acquireNextImage();
                    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                    byte[] bytes = new byte[buffer.capacity()];
                    buffer.get(bytes);
                    save(bytes);
                }
                catch (FileNotFoundException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
                finally {
                    {
                        if(image != null)
                            image.close();
                    }
                }
            }
            private synchronized void save(byte[] bytes) throws IOException {
                OutputStream outputStream = null;
                try{
                    counter++;
                    if ((counter % 2) == 0) {
                        outputStream = new FileOutputStream(fileNormal);
                        outputStream.write(bytes);
                    } else {
                        outputStream = new FileOutputStream(fileWide);
                        outputStream.write(bytes);
                    }
                }finally {
                    if(outputStream != null)
                        outputStream.close();
                }
            }
        };

        readerNormal.setOnImageAvailableListener(readerListener, mBackgroundHandler);
        readerWide.setOnImageAvailableListener(readerListener, mBackgroundHandler);
        final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() {
            @Override
            public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                super.onCaptureCompleted(session, request, result);
                createCameraPreview();
        }
        };

        mCameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                try{
                    cameraCaptureSession.capture(captureBuilder.build(), captureListener, mBackgroundHandler);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {

            }
        },mBackgroundHandler);


    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}
</code>

Заранее спасибо!

...