6

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

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

附加信息:

  • 我尝试了 Play 商店中的一些相机应用程序,有些工作,有些则没有。
  • ZCamera 与闪光灯配合得很好,这让我觉得他们使用三星的相机 API 来让它工作,但后来我注意到 ZCamera 的触摸测光在三星设备上不起作用,这是我在调试 Camera2 实现时遇到的另一个问题。
  • 如果我坚持使用已弃用的 Camera API,Flash 似乎可以正常工作

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

4

3 回答 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;
        }
    }
于 2017-10-06T15:04:23.633 回答
2

在断断续续地工作了一段时间后,我意识到了一些事情。我提到过 ZCamera(来自 play 商店)与 flash 一起工作,我认为他们是通过使用三星 SDK 实现的。我检查了该应用程序,它不使用三星 SDK。

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

我终于意识到,我自己编程的触摸测光流程(触摸对焦/然后拍照)与我在没有触摸对焦的情况下拍照时运行的逻辑非常不同。常规的照片逻辑是从谷歌的 camera2 api 示例代码中借来的,它不能正常工作。

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

于 2017-06-22T15:32:57.340 回答
0

我的应用程序每 5 秒拍一张照片。我(1)选择相机,(2)获取者一个会话,然后在每个循环中我(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 根本不会闪烁。所以我不得不删除那个标志。

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

于 2017-10-12T15:57:51.887 回答