繁体   English   中英

如何冻结/锁定 android 相机 X 预览与 Flash 拍照时灯光更新?

[英]How to Freeze/Lock android Camera X preview with Flash Light updates on taking picture?

我正在实现 Camera X。我面临的问题是实现一种机制来在捕获图片时锁定/冻结相机预览。 目前我已经实施了一种解决方法,但如果 flash 灯在捕获时亮起,它就无法正常工作。 在捕获图像之前,我从previewView (PreviewView) previewView.getBitmap()获得一个帧,然后在captureImage (ImageView) 中显示。 但冻结帧不显示 flash 灯更新。 我当前的代码如下


    private void capturePhoto() {

        showProgress(true);

        // Get the Information to be used & stored with Image
        ContentValues contentValues = getImageSaveInfo();

        Uri externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

        ImageCapture.OutputFileOptions options = new ImageCapture.OutputFileOptions
                .Builder(getContentResolver(), externalUri, contentValues)
                .build();


        // Play the Capture Sound when a picture is captured.
        playCameraShutterSound();

        // Display current frame From Preview in ImageView.
        freezePreview(true);

        imageCapture.takePicture(options,
                ContextCompat.getMainExecutor(this),
                new ImageCapture.OnImageSavedCallback() {

                    @Override
                    public void onImageSaved(@NonNull ImageCapture.OutputFileResults results) {

                        ToastUtility.successToast(getApplicationContext(),
                                "Photo Capture Successfully");

                        // Update Last Taken Image View with new Image

                        getLastTakenImage();

                        if (results.getSavedUri() != null) {

                            Log.d(TAG, "Image Saved At -> " + results.getSavedUri().toString());

                        }

                        showProgress(false);
                        freezePreview(false);

                    }

                    @Override
                    public void onError(@NonNull ImageCaptureException exception) {

                        ToastUtility.errorToast(getApplicationContext(),
                                "Photo Couldn't Capture");

                        Log.d(TAG, "Image Capture Error -> " + exception.getMessage());

                        showProgress(false);
                        freezePreview(false);

                    }
                });

    }


    private void freezePreview(boolean value) {

        if (value) {

            Bitmap bitmap = mainBinding.previewView.getBitmap();

            Glide.with(getApplicationContext())
                    .load(bitmap).into(mainBinding.captureImage);

            mainBinding.captureImage.setVisibility(View.VISIBLE);

            mainBinding.previewView.setVisibility(View.INVISIBLE);

        } else {

            mainBinding.previewView.setVisibility(View.VISIBLE);

            mainBinding.captureImage.setVisibility(View.INVISIBLE);

        }

    }

flash 在调用takePicture()后的某个时间点被触发,CameraX 中没有回调,因此无法直接知道它何时被触发。

您可以改为使用 camera2 互操作来间接检查flash state 您可以将 session CaptureCallback添加到 ImageCapture 的配置中,然后在回调的onCaptureCompleted中,检查 flash Z9ED39E2EA931586B6A985A6942EFRED57E 的结果是否为总数

// Override onCaptureCompleted to check for the flash state
CameraCaptureSession.CaptureCallback sessionCaptureCallback = //... ;

// Initialize an ImageCapture builder
ImageCapture.Builder configBuilder = new ImageCapture.Builder();

// Add the session CaptureCallback to it
new Camera2Interop.Extender<>(configBuilder)
    .setSessionCaptureCallback(sessionCaptureCallback);

// Build the ImageCapture use case
ImageCapture useCase = configBuilder.build();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM