Android Camera2 API闪存问题

时间:2019-07-07 16:16:34

标签: android flutter android-camera2

我正在使用camera2 API,并且在控制不同的闪光模式时遇到问题。

我的代码如下:

private boolean setFlashMode(String flashMode) {
        try {
            switch (flashMode) {
                case "on":
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                    break;
                case "off":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
                    break;
                case "auto":
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
                case "torch":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
                    break;
                default:
                    return false;
            }
            cameraCaptureSession.setRepeatingRequest(
                    captureRequestBuilder.build(), null, null);
            return true;
        } catch (CameraAccessException e) {
            e.printStackTrace();
            return false;
        }
    }

torchoff来回切换没有问题,但是,如果我尝试将其设置为on,不仅无效,而且将设置破坏为{ {1}}。

现在,我已经读过this,并且了解到有不同的级别来控制闪光灯和其他东西,但是我无法解决这个问题,因为这是我第一次使用{{1 }}(我正在向现有代码中添加功能),文档没有帮助。

我明显在做什么错了?

编辑 这是@ eddy-talvala回答后我的代码的样子:

torch

仍然没有运气,但是我认为我对此有了更好的理解,即使它并没有按预期运行。

为了更加清楚,我想要实现的是在这些模式之间进行切换的能力:

  • camera2:无论曝光条件如何,在拍摄照片时闪光灯始终闪光
  • private boolean setFlashMode(String flashMode) { try { switch (flashMode) { case "on": captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); break; case "off": captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); break; case "auto": captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); case "torch": captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); break; default: return false; } cameraCaptureSession.setRepeatingRequest( captureRequestBuilder.build(), null, null); return true; } catch (CameraAccessException e) { e.printStackTrace(); return false; } } :拍照时闪光灯不会闪光
  • on:根据曝光条件,让系统选择是否闪光或闪光
  • off:即使在没有拍照的情况下,使用相机时也请保持闪光灯闪光

auto切换到torch仍然有效,但切换到其他链接则无效。 torch不会在弱光条件下闪光,并且如果我从off切换到auto,则很有可能闪光灯仍然像auto一样保持亮着。而且,切换到torch不会在拍照时引起任何闪光。

我的“演示”应用是camera plugin for Flutter项目示例的修改版本,因为我要做的是编辑插件,添加所需的本机功能。修改意味着我已经添加了dart代码来调用该方法,并在UI中添加了一些按钮以在模式之间进行切换。拍照时,我仍然使用“原样”插件。

1 个答案:

答案 0 :(得分:1)

对于“开”,您要设置CONTROL_AE_MODE两次-您是否要将其设置为“始终闪烁”或“从不闪烁”?现在,“永远闪烁”是胜利。

通常,名称中带有FLASH的任何AE_MODE选项都将覆盖FLASH_MODE;如果设置了AUTO_FLASH,ALWAYS_FLASH或REDEYE选项,则将FLASH_MODE设置为什么都没有关系。仅对AE_MODE_ON和OFF有意义,在这种情况下,FLASH_MODE控制发生的情况。

也就是说,您实际上并不想使用FLASH_MODE_SINGLE(即“为此请求使用闪光灯”,因此重复这样的请求不是一个好主意),即使它实际上不会做任何事情。只需在TORCH和OFF之间切换FLASH_MODE。

对于“关闭”,您还将完全禁用自动曝光,而不仅仅是关闭闪光灯。如果您不想让闪光灯闪光,只需将AE_MODE设置为AE_MODE_ON,将FLASH_MODE设置为OFF。

“火炬”模式也是如此。

目前尚不清楚您在使用“ on”时遇到什么问题-您只是说它不起作用,但希望上面的某些方法可以解决该问题。