java - Android:如何检测相机是否闪烁

标签 java android android-camera

我正在使用 Android 的 Camera2 API,目前我希望相机在准备闪光时执行特定操作。

构建 CaptureRequest 时,以下行:

captureRequest.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

允许相机在低光照条件下闪光。但是,我不知道如何检测相机是否准备好闪光。似乎关于此特定操作的在线文献非常少。

在处理相机的 CaptureCallback 中的部分结果时,我尝试检查 FLASH_STATE 是否处于 FLASH_STATE_READY 状态,但似乎关键不在不可用 - 它一直返回 null。也许我没有在正确的地方检查?

相机的 CaptureCallback,如下所示(基于 Google 的 Camera2Basic 代码示例):

private CameraCaptureSession.CaptureCallback mCaptureCallback
        = new CameraCaptureSession.CaptureCallback()    {
    private void process(CaptureResult result)  {
        switch(mState)  {
            case STATE_PREVIEW: break;
            case STATE_WAITING_LOCK:
                // checking if result.get(CaptureResult.FLASH_STATE) == 
                // CaptureResult.FLASH_READY over here didn't work because
                // null was returned
                int afState = result.get(CaptureResult.CONTROL_AF_STATE);
                if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
                        CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
                    Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                    if (aeState == null ||
                            aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
                        mState = STATE_WAITING_NON_PRECAPTURE;
                        captureStillPicture();
                    } else {
                        runPrecaptureSequence();
                    }
                }
                break;
            case STATE_WAITING_PRECAPTURE:
                Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                if (aeState == null ||
                        aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
                        aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
                    mState = STATE_WAITING_NON_PRECAPTURE;
                }
                break;
            case STATE_WAITING_NON_PRECAPTURE:
                Integer aeState1 = result.get(CaptureResult.CONTROL_AE_STATE);
                if (aeState1 == null || aeState1 != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
                    mState = STATE_PICTURE_TAKEN;
                    captureStillPicture();
                }
                break;
        }
    }

    @Override
    public void onCaptureProgressed(CameraCaptureSession session,
                                    CaptureRequest request, CaptureResult partialResult) {
        super.onCaptureProgressed(session, request, partialResult);
        process(partialResult);
    }

    @Override
    public void onCaptureCompleted(CameraCaptureSession session,
                                   CaptureRequest request, TotalCaptureResult result) {
        super.onCaptureCompleted(session, request, result);
        process(result);
    }
};

最佳答案

documentation您可以阅读以下针对 FLASH_STATE 键的语句:

Optional - This value may be null on some devices.

基本上,即使您使用的是 Lollipop 设备,您也不能确定支持 Camera2 APi 的所有功能。功能有限的设备称为“有限设备”。

有关更多信息,请查看 this页。这很好地描述了它。

编辑: 要回答基本上是错误的评论: 文档说:

When the camera device doesn't have flash unit (i.e. android.flash.info.available == false), this state will always be UNAVAILABLE. Other states indicate the current flash status.

因此,如果设备上没有闪存,FLASH_STATE 也会存在并将返回 UNAVAILABLE

文档几乎说明了您必须了解的所有内容。最重要的事实是,它取决于硬件级别/硬件模式。


总结一下

对于 LEGACY 设备

它将返回以下内容

  • 如果 AE 模式设置为 ON_ALWAYS_FLASH 则触发
  • 如果闪光模式设置为 TORCH 则触发
  • 如果相机没有闪光灯则不可用。

当设备至少为 LEVEL_LIMITED 时:

这些值是可能的,但不能保证它们都有效:

  • 不可用
  • 充电
  • 准备好
  • 被解雇
  • 部分

关于java - Android:如何检测相机是否闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31823376/

相关文章:

java - JVisualVM 内存采样 : Remote applications are not supported

java - 在自己的类中实例化对象

java - 无法在简单的java程序中读取cloud foundry env变量(不使用spring)

java - 共享首选项 - 它们存在多久以及用户可以编辑它们吗?

android - 如何更改复选框的颜色?

安卓相机控制

java - 如何将 Dojo Data 网格单元格值重定向到另一个页面?

android.content.res.Resources$NotFoundException : String resource ID #0x1 Error

android - 从android中的画廊和相机捕获图像

android - 从相机捕获后如何旋转图像