Camera2 Api自动闪光不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Camera2 Api自动闪光不起作用相关的知识,希望对你有一定的参考价值。

我需要帮助android相机2 api自动闪光灯。此解决方案适用于一部手机但不适用于另一部手机。我花了几个小时寻找解决方案,但我没有成功。

我的takePhoto代码:

pictureTaken = false;
    if (null == cameraDevice) {
        Log.e(TAG, "cameraDevice is null");
        return;
    }
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        int width = 1024;
        int height = 768;
        cv.setBackground(getResources().getDrawable(R.drawable.fotak_zeleny));
        ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
        List<Surface> outputSurfaces = new ArrayList<Surface>(2);
        outputSurfaces.add(reader.getSurface());
        outputSurfaces.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);
        captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
        captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
        if (flashMode == FLASH_AUTO) {
            captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
        } else if (flashMode == FLASH_ON) {
            captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
        } else if (flashMode == FLASH_OFF) {
            captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
        }

        // Orientation
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
        final File file = new File(fileName);
        if (file.exists()) {
            file.delete();
        } 
etc....

我的创建相机预览代码:

protected void createCameraPreview() {
    try {
        SurfaceTexture texture = textureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
        Surface surface = new Surface(texture);
        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);

        captureRequestBuilder.addTarget(surface);
        cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                //The camera is already closed
                if (null == cameraDevice) {
                    return;
                }
                // When the session is ready, we start displaying the preview.
                cameraCaptureSessions = cameraCaptureSession;
                updatePreview();
            }

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

            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException ex) {
        ex.printStackTrace();
    }
}

这个解决方案在我的LG手机上工作正常,但阿尔卡特无法正常工作。我尝试了很多写在这里的想法,但没有成功。

可以帮帮我吗?

十分感谢

(对不起我的英语不好)

答案

您还应该为预览请求设置所选的AE_MODE,并在用户切换闪光模式时更新它。此外,您需要在任何高于LEGACY级别的设备上运行预捕获序列。

仅针对单个静止捕获请求更改闪光模式将无法正常工作,因为手机将无法触发预闪以正确计算闪光功率。

看看camera2basic运行预捕获序列。如果可能,它总是将AE模式设置为AE_MODE_AUTO_FLASH,但相同的代码对其他闪光模式可以正常工作(尽管如果闪光灯设置为OFF,您可以跳过预捕获序列,一般情况下,只要聚焦质量正常)。

另一答案

如果你点击CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH命令,你会看到:

  • 可以在预捕获序列期间闪光 (由{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger}触发)和 可能会因为捕获而被解雇 {@link CaptureRequest#CONTROL_CAPTURE_INTENT android.control.captureIntent}字段设置为STILL_CAPTURE

这意味着您必须在捕获图片之前先触发预捕获序列。

可以在这里查看Google的示例应用程序,以获取详细的实现,https://github.com/google/cameraview

另一答案

我使用默认相机应用程序,因为这个相机api在不同的手机上是不同的。

以上是关于Camera2 Api自动闪光不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 camera2 API 检查可用的前置闪光灯

EGL 错误:0x3003,相机设备遇到严重错误(Camera2 Api)

Camera2 API 无法关闭 TORCH 模式

Android Camera2 拍照——切换摄像头,延时拍摄和闪光模式

Camera2 API预览方面已损坏

如何检查光量? [复制]