有奇怪的情况。我取了标准的谷歌样本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
。
我遇到了问题,当我点击拍照按钮时,相机正在闪烁,就是这样。App进入栈
我做错了什么?
编辑
I figure out next:
我已经在三个不同的设备Meizu MX5
, Samsung S5
和Samsung S6
上尝试了flash。
其中两个Meizu MX5
, Samsung S5
在上面的代码中正常工作,应用程序不能在堆栈中驱动。
Samsung S6
出现问题,但是…
方法setAutoFlash()
在代码内不同位置调用了3次
-
captureStillPicture()
-
unlockFocus()
-
onConfigured()
和技巧是,如果我禁用setAutoFlash()
在captureStillPicture()
Samsung S6
它是停止堆叠和flash开始工作,但如果我尝试这种方法Meizu MX5
, Samsung S5
flash不工作…
最终我找到了解决办法
正如我所说的方法
protected final void setAutoFlash(CaptureRequest.Builder requestBuilder) {
if (isFlashSupported) {
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
}
}
在代码的三个不同位置被调用。
-
captureStillPicture()
-
unlockFocus()
-
onConfigured()
所以我在每个方法中都局部实现了requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
行。
最后我得到:
-
unlockFocus()
->mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
-
onConfigured()
->mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
和此方法保留自动设置
-
captureStillPicture()
->captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
但是我不知道为什么我有这样的问题…如果有人知道原因,请告诉我。