在camera2中设置自动闪光会导致createCaptureSession失败

问题描述

我已经在Android应用程序中实现了Camera2。为了拍照,我写了这种方法

    public void takePicture(final MethodChannel.Result result,char captureFlashMode) {
    try {
        ImageReader reader = ImageReader.newInstance(previewSize.getWidth(),previewSize.getHeight(),ImageFormat.JPEG,1);
        final File file = new File(activity.getCacheDir(),"pic.jpg");
        reader.setOnImageAvailableListener(new TakePictureImageListener(flutterMethodListener,result,file),backgroundHandler);
        final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
        captureBuilder.addTarget(reader.getSurface());
        captureBuilder.set(CaptureRequest.CONTROL_MODE,CameraMetadata.CONTROL_MODE_AUTO);
        setFlashMode(captureBuilder,captureFlashMode);
        captureBuilder.set(CaptureRequest.JPEG_ORIENTATION,getJpegOrientation());
        captureRequestBuilder.addTarget(reader.getSurface());
        cameraDevice.createCaptureSession(Arrays.asList(reader.getSurface()),new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(CameraCaptureSession session) {
                try {
                    session.capture(captureBuilder.build(),new CaptureListener(CameraView.this,flutterMethodListener,backgroundHandler);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onConfigureFailed(CameraCaptureSession session) {
                flutterMethodListener.onTakePictureFailed(result,"-11","Error in configure session");
            }
        },backgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

这是setFlashMode方法。

   private void setFlashMode(CaptureRequest.Builder previewRequestBuilder,char flashMode) {
    if(flashSupported) {
        switch (flashMode) {
            case 'A':
                previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
                break;
            case 'O':
                previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON);
                previewRequestBuilder.set(CaptureRequest.FLASH_MODE,CameraMetadata.FLASH_MODE_TORCH);
                break;
            case 'F':
                previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.FLASH_MODE_OFF);
        }
    }
}

我将A作为自动手电筒传递给setFlashMode方法。 我的问题仅在Samsung S6(android 7)这样的少数手机中,onConfigured无法通话,而onConfigureFailed被通话,所以我无法拍照。 调试后,通过在requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);方法中注释setFlashModeonConfigured成功调用,我可以拍照了。

三星S6中的CONTROL_AE_MODE_ON_AUTO_FLASH有什么问题?

设置自动闪光灯以在Camera2中拍照的最佳做法是什么

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...