Android Camera2 API Flash 在 galaxy 设备上不工作

Android Camera2 API Flash doesnt work on galaxy devices

我正在使用 Android Camera2 API 为应用程序拍照,但我无法让闪光灯在大多数三星 Galaxy 设备(galaxy s6 edge、galaxy s7、星系 j7)。我相信我已经正确地实现了 flash 逻辑,因为 Google 曾经在 Play 商店中的相机应用程序也表现出相同的行为。此外,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 行是我读到的其他内容,建议帮助 flash 为我正常工作,但它似乎没有做任何事情

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

附加信息:

任何关于如何完成工作闪光的帮助将不胜感激

断断续续地工作了一段时间后,我意识到了一些事情。我提到 ZCamera(来自 Play 商店)可与 Flash 配合使用,我认为他们是通过使用 Samsung SDK 实现的。我检查了应用程序,它没有使用三星 SDK。

我还将 Samsung SDK 合并到我的应用程序中,这并没有改变任何东西。三星 SDK 实际上只是 google 相机 2 的包装器,因此您可以添加一些三星特定的功能,将其添加到您的项目中不会修复任何三星兼容性。

我终于意识到,我自己编写的触摸测光流程(触摸 focus/then 拍照)与我 运行 在不触摸的情况下拍照的逻辑非常不同专注。常规照片逻辑是从 googles camera2 api 示例代码中借用的,它没有工作 属性。

让闪光灯在三星设备上闪光的技巧(或至少对我有用的方法)是首先触发对 AE 级别的检查,一旦收敛,然后启动自动对焦触发器。如果打开闪光灯,这将启动闪光灯以检查 AE 级别和对焦,然后再次启动闪光灯以拍摄照片

实际上使用camera2 API 在android 设备中非常特殊。有些方法可能无法实现。例如:this and 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;
        }
    }

我的应用程序每 5 秒拍摄一张照片。我 (1) select 相机,(2) 获取一个会话,然后在每个循环中我 (3) 创建一个捕获请求,我在其中设置闪光模式并在会话中调用捕获方法。

我的 Samsung SM-G550T(Android 版本 6.01)没有问题,但我的 Moto G4(Android 版本 7.0)的闪光模式有一些问题。我将两部手机都设置为 Flash,但仅使用此设置:

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根本不闪。所以我不得不删除那个标志。

我尝试了许多不同的附加设置和设置组合,其中 none 解决了这个问题。我想知道有多少设备受到此问题的影响。