ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-在Camera2 API中切换闪光灯

2019-10-11 00:26:30  阅读:206  来源: 互联网

标签:android-camera2 android android-camera camera-flash


我的问题是,当我在不同的闪光模式之间切换然后想要捕获图像时,我的captureBuilder不会设置所选的闪光模式.它仅在我关闭并重新打开相机后才起作用.

我以https://github.com/googlesamples/android-Camera2Basic为起点.

我的方法:

   private void captureStillPicture() {
  try {
     final Activity activity = (Activity) context;
     if (null == activity || null == mCameraDevice) {
        return;
     }
     // This is the CaptureRequest.Builder that we use to take a picture.
     CaptureRequest.Builder captureBuilder =
           mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
     captureBuilder.addTarget(mImageReader.getSurface());

     // Use the same AE and AF modes as the preview.
     captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
           CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
     setCurrentFlash(captureBuilder);

     // Orientation
     int rotation = activity.getWindowManager()
           .getDefaultDisplay()
           .getRotation();
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));

     CameraCaptureSession.CaptureCallback captureCallback =
           new CameraCaptureSession.CaptureCallback() {

              @Override
              public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                    @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                 super.onCaptureCompleted(session, request, result);
                 Toast.makeText(context, "image captured", Toast.LENGTH_SHORT)
                       .show();
                 unlockFocus();
              }
           };

              mCaptureSession.stopRepeating();
     mCaptureSession.capture(captureBuilder.build(), captureCallback, null);
  } catch (CameraAccessException e) {
     Log.e(this.getClass()
           .getSimpleName(), e.getMessage(), e);
  }

这是setCurrentFlash方法:

   private void setCurrentFlash(CaptureRequest.Builder requestBuilder) {
  if (mFlashSupported) {
     switch (flashMode.name()) {
        case FLASH_AUTO:
           requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                 CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
           break;
        case FLASH_ON:
           requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                 CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
           break;
        case FLASH_OFF:
           requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
           break;
        default:
           requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                 CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
           break;
     }
  }

为什么建筑商在拍摄前未正确设置闪光灯?

*****编辑*****

通过像调用Eddy Talvala一样调用runPrecaptureSequence()时将flash设置为PreviewRequestBuilder来解决问题

   private void runPrecaptureSequence() {
  try {
     // This is how to tell the camera to trigger.
     setCurrentFlash(previewRequestBuilder);
     previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
           CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
     // Tell #mCaptureCallback to wait for the precapture sequence to be set.
     state = STATE_WAITING_PRECAPTURE;
     captureSession.capture(previewRequestBuilder.build(), mCaptureCallback, backgroundHandler);
  } catch (CameraAccessException e) {
     e.printStackTrace();
  }

解决方法:

您还希望在预览请求中更新闪光模式;通常,相机设备在触发预捕获序列(使用AE_PRECAPTURE_TRIGGER)时希望知道所需的闪光模式,以便知道是否应打开预捕获闪光灯,这需要确定最终的闪光灯功率.

通常的事件顺序是:

>将预览闪光模式设置为所需模式
>等待用户按下快门按钮
>发出带有预捕获触发器集的单个预览请求(但保留重复的预览请求,否则).
>等待AE_STATE_PRECAPTURE在捕获结果中停止成为AE状态
>发出最终捕获请求(保持相同的闪光模式)
>在ImageReader中获取最终的JPEG

(这忽略了确保聚焦良好,通常在开始预捕获序列之前/同时完成)

标签:android-camera2,android,android-camera,camera-flash
来源: https://codeday.me/bug/20191010/1888907.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有