我正在使用Android Camera2 API为应用拍摄照片,而且我无法让闪光灯在大多数三星Galaxy设备(galaxy s6 edge,galaxy s7,galaxy j7)上正常工作。我相信我已经正确实施了闪存逻辑,因为以前在Play商店中使用的Google相机应用程序也表现出相同的行为。此外,星系s8似乎与闪光灯配合得很好(虽然结果肯定有不一致的照明)
Galaxy j7的问题在于,当我用闪光灯拍照时(闪光灯锁定或需要闪光灯的场景中有自动闪光灯)闪光灯会长时间保持开启,预览会锁定,然后在7秒之后图像将会拍摄,而闪光灯不是图像的一部分。
我有以下方法处理闪光模式:
private void setAutoFlash(CaptureRequest.Builder requestBuilder)
{
switch (mFlashState)
{
case FLASH_STATE_AUTO:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
//requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
case FLASH_STATE_ON:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
//requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
break;
case FLASH_STATE_OFF:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
//requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
}
}
每次需要CaptureRequest.Builder时都会调用此Flash逻辑
我注意到的3条注释掉的内容是为了帮助我正常工作而建议的,但它似乎无法做任何事情
三星拥有自己的相机API(http://developer.samsung.com/galaxy/camera) 但我读到它只是Camera2的一个包装,我担心他们的API甚至无法解决我的问题。
其他信息:
非常感谢任何有关如何完成工作闪光灯的帮助
答案 0 :(得分:2)
在开启和关闭一段时间后,我意识到了一些事情。我提到ZCamera(来自Play商店)使用flash,我认为他们通过使用Samsung SDK实现了这一点。我检查了应用程序,它没有使用Samsung SDK。
我还将三星SDK整合到我的应用程序中并且没有任何改变。三星SDK实际上只是谷歌相机2的包装,所以你可以添加一些三星特有的功能,将它添加到你的项目不会修复任何三星兼容性。
我终于意识到,我自己编程的触摸测光流程(触摸聚焦/然后拍摄照片)的工作方式与我拍摄无触摸照片时的逻辑非常不同。常规的照片逻辑是从googles camera2 api示例代码中借来的,它并没有正常工作。
让闪光灯在三星设备上启动(或者至少对我有用)的技巧是首先触发AE水平检查,一旦收敛,然后启动自动对焦触发。如果闪光灯开启,则会启动闪光灯以检查自动曝光等级并进行对焦,然后再次闪光以拍摄照片
答案 1 :(得分:2)
实际上使用camera2 API在Android设备中非常特殊。某些方法可能无法实施。例如:this和this。 对于其他人,应根据其他属性设置适当的闪光模式。 在大多数支持camera2API的三星设备中,此代码适用于我:
if (mIsFlashSupported) {
switch (mFlashMode) {
case FLASH_MODE_ON:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_FLUORESCENT);
break;
case FLASH_MODE_OFF:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_DAYLIGHT);
break;
case FLASH_MODE_AUTO:
default:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);
requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_DAYLIGHT);
break;
}
}
答案 2 :(得分:0)
我的应用程序每隔5秒拍一张照片。我(1)选择摄像机,(2)获取一个会话,然后每个循环I(3)创建一个捕获请求,我在其中设置Flash模式并在会话上调用捕获方法。
我的三星SM-G550T(Android版本6.01)没有问题,但我的Moto G4(Android版本7.0)上的Flash模式存在一些问题。我把这两部手机都用到了Flash,但只有这个设置:
CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
我目前遇到LG设备(M210N)(Android版本7.0)的问题。使用我上面提到的设置,我只需一次即可使设备闪烁。如果我完全重新初始化相机(如上所述),设备将再次闪烁一次。
如果我将CONTROL_AE_MODE_ON_ALWAYS_FLASH
设置添加到上面的requestBuilder,那么LG根本不会闪烁。所以我不得不删除那面旗帜。
我为设置尝试了许多不同的附加设置和组合,但没有一个能够消除此问题。我想知道有多少设备受此问题的影响。