-1

有奇怪的情况。我拿了标准的谷歌样本camera2API

无论外部光线如何,我都需要闪光灯永久工作。

为了完成它,我更改了一行代码:

private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
    if (mFlashSupported) {
//            requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
        requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
    }
}

CONTROL_AE_MODE_ON_AUTO_FLASH我把它改成了CONTROL_AE_MODE_ON_ALWAYS_FLASH

而且我遇到了问题,当我单击Take picture按钮时,相机正在闪烁,就是这样。应用程序进入堆栈...

我究竟做错了什么?

编辑

我接下来弄清楚:

我已经在三个不同的设备上尝试过 tern on flash Meizu MX5Samsung S5并且Samsung S6

其中两个,Meizu MX5Samsung S5上面的代码一起正常工作,并且应用程序不在堆栈中驱动。

出现问题Samsung S6,但是...

方法setAutoFlash()在不同地方在代码内调用 3 次

  1. captureStillPicture()
  2. unlockFocus()
  3. onConfigured()

诀窍是,如果我禁用它setAutoFlash()captureStillPicture()因为Samsung S6它会停止堆叠并且 flash 开始工作,但是如果我尝试这种方法Meizu MX5Samsung S5flash 不起作用......

4

1 回答 1

0

最终我找到了解决方案

正如我所说的方法

protected final void setAutoFlash(CaptureRequest.Builder requestBuilder) {
    if (isFlashSupported) {
        requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
    }
}

在代码中的三个不同位置调用。

  1. captureStillPicture()
  2. unlockFocus()
  3. onConfigured()

所以我requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);在每种方法中本地实现了这一行。

最后我得到:

  1. unlockFocus()-> mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
  2. onConfigured()-> mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);

并且对于这种方法仍然是自动设置

  1. captureStillPicture()-> captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

但我不知道我遇到这个问题的原因......如果有人知道原因,请告诉我。

于 2016-10-30T16:13:48.163 回答