安卓Camera2 API闪光灯在Galaxy设备上无法使用

6
我正在使用Android Camera2 API为应用程序拍摄照片,但在大多数三星Galaxy设备(Galaxy S6 Edge、Galaxy S7、Galaxy J7)上无法正确使用闪光灯。我相信我已经正确实现了闪光灯逻辑,因为曾经在Play商店上发布的Google相机应用程序也表现出相同的行为。虽然Galaxy 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时,都会调用此闪光灯逻辑。

这3行注释掉的代码是我读到的建议可以帮助我使闪光灯正常工作,但似乎没有任何作用。

三星有自己的相机API(http://developer.samsung.com/galaxy/camera),但我看到它只是Camera2的一个包装器,我担心他们的API甚至不能解决我的问题。

其他信息:

  • 我尝试过一些来自Play Store的相机应用,有些能用,有些不能用。
  • ZCamera的闪光灯功能很好,这让我想到他们使用了三星的相机API来使其正常工作,但后来我发现ZCamera在三星设备上的触摸测光不起作用,这是我在调试Camera2实现时遇到的另一个问题。
  • 如果我坚持使用已弃用的Camera API,则闪光灯似乎可以正常工作。

非常感谢提供有关如何实现工作闪光灯的任何帮助。

3个回答

3

在Android设备中,实际上使用camera2 API是非常特殊的。某些方法可能没有被实现。例如:这个这个。 对于其他设备,应根据其他属性设置适当的闪光灯模式。 这段代码在大多数支持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
经过我断断续续的工作,我意识到了一些事情。 我提到ZCamera(来自Play商店)可以使用闪光灯,我认为他们是通过使用三星SDK实现的。 我检查了应用程序,它并没有使用三星SDK。
我还将三星SDK整合到我的应用程序中,但并没有改变任何东西。 三星SDK实际上只是Google相机2的包装器,因此您可以添加一些三星特定功能,将其添加到项目中不会修复任何三星兼容性问题。
我最终意识到的是,我编写的触摸测量流程(触摸对焦/然后拍照)与我们在不需要触摸对焦时运行的逻辑非常不同。 普通的照片逻辑是从Google相机2 API示例代码中借用的,但它不起作用。
让三星设备闪光灯发光的技巧(或者至少对我有用的技巧)是首先触发对AE级别的检查,一旦收敛,就开始自动对焦触发器。 如果打开闪光灯,则会触发闪光灯以检查AE级别和对焦,然后再次触发闪光灯拍照。

1
我在S6上使用Android 7时遇到了非常类似的问题(Android 5正常工作)。当使用FLASH_MODE_ONCE或FLASH_MODE_TORCH时,照片从未被拍摄,日志中没有错误消息,并且没有任何错误/失败回调被调用。尝试将所有控制模式设置为关闭/手动,只是为了看看它是否消失,但它仍然不会拍照或引发任何类型的错误。你说的检查自动曝光水平是什么意思?如何以编程方式完成?是在预览会话还是捕获会话中完成的? - Anthony

0
我的应用程序每5秒拍摄一张照片。我(1)选择相机,(2)获取会话,然后在每个循环中,我(3)创建一个捕获请求,在其中设置闪光灯模式并在会话上调用捕获方法。
我的三星SM-G550T(Android版本6.01)没有任何问题,但是我的Moto G4(Android版本7.0)闪光灯模式有些问题。我让两部手机都闪光了,但只有这个设置才行:
CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);

我目前遇到了一个LG设备(M210N)(Android版本7.0)的问题。使用我上面提到的设置,我可以让设备闪烁一次。如果我完全重新初始化相机(如上所述),设备将再次闪烁一次。

如果我在上述requestBuilder中添加CONTROL_AE_MODE_ON_ALWAYS_FLASH设置,则LG根本不会闪烁。因此,我不得不删除该标志。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接