Android Camera2 API Flash无法在galaxy设备上运行

时间:2017-06-13 19:22:00

标签: java android galaxy camera2 camera-flash

我正在使用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甚至无法解决我的问题。

其他信息:

  • 我尝试过一些来自游戏商店的相机应用程序,一些工作和其他人不这样做。
  • ZCamera可以正常使用闪光灯,这让我觉得他们使用samsungs相机API来让它工作,但后来我注意到ZCamera的触控测光在三星设备上无法工作,这是我在调试时遇到的另一个问题Camera2实施。
  • 如果我坚持使用已弃用的Camera API
  • ,Flash似乎工作正常

非常感谢任何有关如何完成工作闪光灯的帮助

3 个答案:

答案 0 :(得分:2)

在开启和关闭一段时间后,我意识到了一些事情。我提到ZCamera(来自Play商店)使用flash,我认为他们通过使用Samsung SDK实现了这一点。我检查了应用程序,它没有使用Samsung SDK。

我还将三星SDK整合到我的应用程序中并且没有任何改变。三星SDK实际上只是谷歌相机2的包装,所以你可以添加一些三星特有的功能,将它添加到你的项目不会修复任何三星兼容性。

我终于意识到,我自己编程的触摸测光流程(触摸聚焦/然后拍摄照片)的工作方式与我拍摄无触摸照片时的逻辑非常不同。常规的照片逻辑是从googles camera2 api示例代码中借来的,它并没有正常工作。

让闪光灯在三星设备上启动(或者至少对我有用)的技巧是首先触发AE水平检查,一旦收敛,然后启动自动对焦触发。如果闪光灯开启,则会启动闪光灯以检查自动曝光等级并进行对焦,然后再次闪光以拍摄照片

答案 1 :(得分:2)

实际上使用camera2 API在Android设备中非常特殊。某些方法可能无法实施。例如:thisthis。 对于其他人,应根据其他属性设置适当的闪光模式。 在大多数支持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根本不会闪烁。所以我不得不删除那面旗帜。

我为设置尝试了许多不同的附加设置和组合,但没有一个能够消除此问题。我想知道有多少设备受此问题的影响。