首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓Camera2 API闪存问题

安卓Camera2 API闪存问题
EN

Stack Overflow用户
提问于 2019-07-07 16:16:34
回答 1查看 708关注 0票数 1

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

我的代码如下:

代码语言:javascript
运行
复制
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,它不仅不能工作,而且还破坏了对torch的设置。

现在,我已经阅读了,并且理解了控制闪存和其他东西的不同级别,但是我无法将我的注意力集中在这个问题上,因为这是我第一次使用camera2 (我正在向现有代码添加一个功能),而文档并没有帮助我。

我明显做错了什么?

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

代码语言:javascript
运行
复制
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在弱光条件下不会触发闪光灯,如果我从torch切换到auto,很有可能闪光灯仍然像torch一样开着。此外,切换到on并不会导致任何闪光灯在拍照时被触发。

我的“演示”应用程序是颤振相机插件项目示例的修改版本,因为我要做的是编辑插件,添加我需要的这个本地特性。修改意味着我添加了省道代码来调用该方法,并在UI中添加了一些按钮以在模式之间切换。在拍照时,我仍然使用插件“原样”。

EN

回答 1

Stack Overflow用户

发布于 2019-07-08 22:56:22

对于"on",您要设置两次CONTROL_AE_MODE --您是试图将其设置为“始终闪存”还是“永不闪现”?现在“永远闪现”正在获胜。

通常,名称中包含闪存的任何AE_MODE选项都会覆盖FLASH_MODE;如果您设置了AUTO_FLASH、ALWAYS_FLASH或REDEYE选项,那么您将FLASH_MODE设置为什么并不重要。这只关系到AE_MODE_ON和OFF,在这种情况下,FLASH_MODE控制发生了什么。

尽管如此,您还是不想使用FLASH_MODE_SINGLE (上面写着“为这个请求使用闪存”,所以重复这样的请求并不是个好主意),即使它实际上不会做任何事情。只需在火炬和关机之间切换FLASH_MODE。

此外,“关闭”,你是完全禁用自动曝光,而不仅仅是关闭闪光灯。如果您不想闪光灯触发,只需将AE_MODE设置为AE_MODE_ON,FLASH_MODE设置为OFF即可。

“火炬”模式也是如此。

现在还不清楚你遇到了什么"on“问题--你只是说它不起作用,但希望上面的一些方法能解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56923944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档