Android Camera2 API Flash 不适用于 Galaxy 设备

问题描述 投票:0回答:4

我正在使用 Android Camera2 API 为应用程序拍照,但我无法让闪光灯在大多数 Samsung Galaxy 设备(galaxy s6 edge、galaxy s7、galaxy j7)上正常工作。我相信我已经正确实现了 Flash 逻辑,因为 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 商店中的一些相机应用程序,有些可以用,有些则不行。
  • ZCamera 与闪光灯配合得很好,这让我认为他们使用三星的相机 API 来使其工作,但后来我注意到 ZCamera 的触摸测光在三星设备上不起作用,这是我在调试 Camera2 实现时遇到的另一个问题。
  • 如果我坚持使用已弃用的相机 API,Flash 似乎可以正常工作

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

java android android-camera2 galaxy camera-flash
4个回答
3
投票

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

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

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

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

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


0
投票

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

我的 Samsung 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 根本不会闪烁。所以我必须删除那个标志。


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


0
投票

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 月 6 日 15:04 回复
Vlad 的用户头像
弗拉德
3133 青铜徽章
添加评论

© www.soinside.com 2019 - 2024. All rights reserved.