Android Camera2闪关灯详解

在Android Camrea2中与Flash有关的只有两个字段:

 
  1. CaptureRequest.FLAH_MODE

  2. CaptureRequest.CONTROL_AE_MODE

所有在使用闪光灯时,必须先保证CaptureRequest.CONTROL_MODE为ATUO,而且必须保证CameraCharacteristics.FLASH_INFO_AVAILABLE == true 。

首先先说说CaptureRequest.FLAH_MODE,这个字段是可以由用户控制的,要使用它的话,还要保证CaptureRequest.CONTROL_AE_MODE的值为ON或者OFF,它有三个值:

 
  1. OFF:this catpure 闪光灯关闭 

  2. SINFGLE:this capture 闪光灯打开

  3. TORCH:闪光灯持续打开

然后再看看CaptureRequest.CONTROL_AE_MODE,用于选择当前自动曝光模式的控件:

通过CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES进行查询支持的模式。

 
  1. OFF:自动曝光停用,用户控制曝光,增益,帧时长和闪光。

  2. ON:标准自动曝光,闪光灯控件停用,用户可以将闪光灯设置为触发或者手电筒模式。        

  3. ON_AUTO_FLASH:标准自动曝光,闪光灯听从HAL指令开启,以进行预拍摄和静像拍摄.

  4.     不允许用户控制闪光灯的功能。在预拍摄期间可能打开闪光灯,

  5.     和 如果CaptureRequest.CONTROL_CAPTURE_INTENT被设置为STILL_CAPTURE,

  6.     闪光灯将一直打开。

  7. ON_ALWALYS_FLASH:标准自动曝光,闪光灯始终触发以进行拍摄,并听从HAL指令进行

  8. 预拍摄。不允许用户控制闪光灯的功能。它类似于ON模式,在预拍摄期间可能打

  9. 开闪光灯,如果CaptureRequest.CONTROL_CAPTURE_INTENT被设置

  10. 为STILL_CAPTURE,闪光灯将一直打开。

  11. ON_AUTO_FLASH_REDEYE:标准自动曝光,闪光灯听从HAL指令开启,以进行预拍摄

  12.    和静像拍摄。在预拍摄序列结束时使用闪光灯连拍,以减轻最终照片中的红眼现象。

  13.     不允许用户控制闪光灯的功能。如果被相机认为有必要的话,在预拍摄期间,为减

  14.     少红眼现象的闪光灯会打开。

在AE的状态中,有两个与闪光灯有关的状态:

 
  1. 1.AE_STAET_FLASH_REQUIRED:

  2.   HAL已聚焦曝光,但认为需要启动闪光灯才能保证亮度充足。

  3.   用于确定是否可使用零快门延迟帧。   

  4.  

  5.  2.AE_STATE_PRECATURE:

  6.   HAL正在处理预拍序列。根据AE模式,该模式可能包括触发闪光灯以进行测光

  7.   或发出闪光脉冲以减轻红眼现象

          二、系统摄像机的闪光灯模式

1)录像

录像情况下,闪光灯的模式很简单,就两个:

 
  1. 闪光灯关闭

  2. 闪光灯打开

2)拍照:相对于录像,拍照模式下,闪光灯的设置就多了很多 

 
  1. 前置摄像头

  2. 闪光灯关闭 

  3. 闪光灯自动:亮光条件下:闪光灯不开启。

  4. 暗光条件下:预览和拍照时闪光灯一直打开

  5. 闪光灯开启

 
  1. 后置摄像头

  2. 闪光灯关闭 

  3. 闪光灯自动 

  4. 亮光条件下:闪光灯不开启 

  5. 暗光条件下:

  6. 预览时闪光灯不打开,对焦时闪光灯打开,拍照时,闪光灯先打开,

  7.        再闪光拍照。

  8. 闪光灯在拍照时才打开:在拍照时,闪光灯打开一次 

  9. 闪光灯打开

                                三、Camera2 中对闪光灯的设置 

对比于系统摄像机的闪光灯模式,在我们自己的APP中的设置:

1)录像模式

   1.1 闪光灯关闭:

 
  1. 对焦正常,前后摄像头切换正常

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,

  5. CameraMetadata.FLASH_MODE_OFF);

   1.2 闪光灯打开:

 
  1. 对焦正常,前后摄像头切换正常

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,

  5. CameraMetadata.FLASH_MODE_TORCH);

  1.3 闪光灯自动:

前置摄像头:

亮光条件下:闪光灯不打开,对焦正常 

暗光条件下:闪光灯打开,对焦正常 

后置摄像头:

亮光条件下:闪光灯不打开,对焦正常

暗光条件下:闪光灯不打开,对焦正常,在对焦时,闪光灯打开

 
  1. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  2. CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

  3. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,

  4.             CaptureRequest.FLASH_MODE_OFF);

不要忘记设置FLASH_MODE为OFF,否则会影响闪光灯的开启。

2) 拍照模式

2.1 闪光灯关闭 

 
  1. 在预览时设置:

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,

  5. CameraMetadata.FLASH_MODE_OFF);

 
  1. 拍照时设置:也可以不用再设置

  2. builder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON);

  4. builder.set(CaptureRequest.FLASH_MODE,

  5.   CaptureRequest.FLASH_MODE_OFF);

2.2 闪光灯打开 

 
  1. 预览时设置:

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3.          CaptureRequest.CONTROL_AE_MODE_ON);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, 

  5. CameraMetadata.FLASH_MODE_TORCH);

 
  1. 拍照时设置:

  2. builder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON);

  4. builder.set(CaptureRequest.FLASH_MODE,

  5.           CaptureRequest.FLASH_MODE_TORCH);

若拍摄时,不设置,会造成拍照时闪光灯关闭。若拍照时设置为

 
  1. builder.set(CaptureRequest.CONTROL_AE_MODE,

  2. CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);

会是在拍照时闪光灯关闭。

2.3 闪光灯自动 

   2.3.1前置摄像头:

亮光条件下:预览时闪光灯不会打开,拍照时闪光灯不打开

暗光条件下:

预览和拍照时闪光灯打开。(没有实现出来)

 
  1. 预览时设置:

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,

  5.                  CaptureRequest.FLASH_MODE_OFF);

 
  1. 拍照时设置:

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

若拍照时设置 AE_MODE_ON_AUTO_FLASH ,则拍照时闪光灯会关闭。在系统摄像头的表现上应该是闪光灯一直开启。

2.3.2 后置摄像头:

亮光条件下:预览时闪光灯不会打开,拍照时闪光灯不打开

暗光条件下:预览时闪光灯不打开,对焦时闪光灯打开,拍照时闪光灯打开 

 
  1. 预览时设置:

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3.   CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,

  5.   CaptureRequest.FLASH_MODE_OFF);

 
  1. 拍照时设置:

  2. builder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

2.4 闪光灯在拍照时打开

2.4.1前置摄像头:

预览时闪光灯不打开,拍照时闪光灯打开

 
  1. 预览时设置:

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,

  5. CameraMetadata.FLASH_MODE_OFF);

 
  1. 拍照时设置:

  2. builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); builder.set(CaptureRequest.FLASH_MODE,CaptureRequest.FLASH_MODE_SINGLE);

2.4.2后置摄像头:

 
  1. 预览时设置:

  2. mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,

  3. CaptureRequest.CONTROL_AE_MODE_ON);

  4. mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, 

  5.           CameraMetadata.FLASH_MODE_OFF);

拍照时设置:

 
  1. builder.set(CaptureRequest.CONTROL_AE_MODE,

  2. CaptureRequest.CONTROL_AE_MODE_ON);

  3. builder.set(CaptureRequest.FLASH_MODE,

  4. CaptureRequest.FLASH_MODE_TORCH);

若拍照时设置为 FLASH_MODE_SINGLE ,在后置摄像头上,第一次拍照亮,后续拍照时闪光灯不亮。解决方案时:用后置摄像头拍照时,设置为torch,或者统一设置为torch。

闪光灯减少红眼现象 一般情况下,不需要设置这个,大多数手机不支持。 

### 使用 Android Camera2 API 实现带闪光灯的拍照功能 为了实现带有闪光灯功能的照片拍摄,可以按照以下方法操作: #### 初始化相机管理器并获取特性列表 首先,在初始化 `CameraManager` 后,通过查询设备上的可用摄像机ID列表来确认所选摄像头是否支持闪光灯。这一步骤非常重要,因为并非所有的摄像头都具备此硬件能力。 ```java // 获取CameraManager实例 CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); String[] cameraIds; try { cameraIds = manager.getCameraIdList(); } catch (CameraAccessException e) { throw new RuntimeException(e); } for (String id : cameraIds){ try { // 查询特定摄像头的能力特征集 StreamConfigurationMap map = manager.getCameraCharacteristics(id).get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Integer flashAvailability = manager.getCameraCharacteristics(id). get(CameraCharacteristics.FLASH_INFO_AVAILABLE); if(Boolean.TRUE.equals(flashAvailability)){ Log.d(TAG,"This device has a flash unit."); }else{ Log.w(TAG,"No flash available on this device"); } }catch(Exception ex){ continue; // 如果访问失败则跳过该摄像头 } } ``` #### 设置捕获请求中的闪光灯参数 当准备构建用于预览或捕捉图像的实际 `CaptureRequest.Builder` 时,应根据需求配置相应的闪光灯模式。这里提供了几种常见的选项供选择: - **自动** (`FLASH_MODE_AUTO`):让系统决定何时开启闪光灯。 - **始终开启** (`FLASH_MODE_TORCH`):保持常亮状态作为手电筒用途。 - **强制启用** (`FLASH_MODE_ON`):每次拍摄照片前都会触发一次强光照射。 - **关闭** (`FLASH_MODE_OFF`):完全禁用闪光灯效果。 ```java if (flashSupported && isTorchOn()) { previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); }else{ previewBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON); } previewBuilder.set(CaptureRequest.FLASH_MODE, mode); //mode为上述四种之一 ``` #### 控制按钮事件处理逻辑 针对UI界面上用来切换闪光灯开关状态的控件绑定点击监听器,并在此处更新内部标志位变量以反映最新的用户偏好设定。每当检测到交互动作发生后,重新提交修改后的 `CaptureRequest` 给会话对象即可完成即时生效的目的[^1]。 ```java private boolean mIsFlashlightEnabled; public void toggleFlashlight(View view) { mIsFlashlightEnabled = !mIsFlashlightEnabled; updatePreview(); // 更新预览界面显示 if(mSession != null){ try { captureStillPicture(); } catch (Exception e) { Toast.makeText(context,e.getMessage(),Toast.LENGTH_SHORT).show(); } } } ``` 以上就是利用 Android Camera2 API 来控制闪光灯的具体做法概述。需要注意的是不同品牌型号之间可能存在细微差异,因此建议开发者们仔细阅读官方文档并参照样例项目来进行调试优化工作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值