java - 在运行时更改 Android Camera 2 的 Flash 设置

标签 java android mobile android-camera2

基本上,我想做的是通过在应用程序中单击按钮来更改 CONTROL_AE_MODE。用户可以使用自动闪光(ON_AUTO_FLASH),如果开启(ON_ALWAYS_FLASH),或关闭(CONTROL_AE_MODE_OFF)。

在这个例子中:https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java

第818行,他们设置了一次闪光灯:

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

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

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

                @Override
                public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                               @NonNull CaptureRequest request,
                                               @NonNull TotalCaptureResult result) {
                    showToast("Saved: " + mFile);
                    Log.d(TAG, mFile.toString());
                    unlockFocus();
                }
            };

            mCaptureSession.stopRepeating();
            mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);

然后在第 840 行构建 CaptureSession。

有没有办法在预览完成后更改 CONTROL_AE_MODE?

我试过重新制作 session ,效果还不错:

if(flashMode == CameraView.CAMERA_FLASH_ON){
            Log.e("CAMERA 2", "FLASH ON");
            mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
        }else if(flashMode == CameraView.CAMERA_FLASH_OFF){
            Log.e("CAMERA 2", "FLASH OFF");
            mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
        }else if(flashMode == CameraView.CAMERA_FLASH_AUTO){
            Log.e("CAMERA 2", "FLASH AUTO");
            mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
        }
        mFlashMode = flashMode;
        if (mCameraCaptureSession != null) {
            mCameraCaptureSession.close();
            mCameraCaptureSession = null;
       }
  createCameraPreviewSession();

出于某种原因,CONTROL_AE_MODE_OFF 会使整个预览变黑。 我尝试在文档中查找更新方法,但没有找到任何内容。

非常感谢任何教程或文档。

最佳答案

如 @cyborg86pl 所述,切换闪光灯模式时不应切换 CONTROL_AE_MODE 。相反,您可以在 FLASH_MODE 之间切换。这是我的案例的一个工作示例:

  when (currentFlashState) {
        FlashState.AUTO -> {
          previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)
        }
        FlashState.ON -> {
          previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
          previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH)
        }
        FlashState.OFF -> {
          previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
          previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
        }
      }
 previewRequest = previewRequestBuilder.build()
 captureSession.setRepeatingRequest(previewRequest, captureCallback, backgroundHandler)

关于java - 在运行时更改 Android Camera 2 的 Flash 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35620400/

相关文章:

java - Astyanax cql3 COUNT 查询返回 ROWS 而不是 NUMBER

android - delphi/android如何通过地址找到涉及的代码行

android - 无法解析 com.github.chrisbanes :PhotoView:1. 3.1

mobile - 向不同移动设备提供不同页面结构 (HTML) 的服务器端选项

java - java中的压缩和解压缩对于不同的编程语言不能很好地工作

java - $Include #include 等价于 Java

javascript - 如何使用 JavaScript 识别移动设备

rest - 确保移动应用程序访问 RESTful Web 服务的安全

java - System.out.print(Arrays.toString());不适用于对象数组

android - 带有 float 操作按钮的共享元素过渡