首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时更改Android相机2的Flash设置

在运行时更改Android相机2的Flash设置
EN

Stack Overflow用户
提问于 2016-02-25 06:56:21
回答 3查看 8.3K关注 0票数 5

基本上,我想要做的是通过点击应用程序中的按钮改变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行,他们设置闪存一次:

代码语言:javascript
复制
// 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吗?

我试过重新安排会议,这有点奏效:

代码语言:javascript
复制
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会将整个预览变成黑色。我试着在文档中查找要更新的方法,但没有发现任何东西。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-19 11:16:49

我不知道你的预览为什么会变黑,但你不需要手动关闭捕获会话。来自.close()方法的文档:

直接使用createCaptureSession(List , CameraCaptureSession.StateCallback, Handler)而不关闭是快速切换到新会话的推荐方法,因为不变的目标输出可以更有效地重用。

因此,您可以重用现有的CaptureRequest.Builder,设置已更改的值,构建新的PreviewRequest,只需使用这个新请求启动新会话,如下所示:

代码语言:javascript
复制
try {
    // Change some capture settings
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
    // Build new request (we can't just edit existing one, as it is immutable)
    mPreviewRequest = mPreviewRequestBuilder.build();
    // Set new repeating request with our changed one
    mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
    e.printStackTrace();
}

它会更快(几乎没有任何可见的冻结预览)。

票数 4
EN

Stack Overflow用户

发布于 2019-01-15 10:01:57

正如@cyborg86pl在切换闪存模式时所提到的,您不应该切换CONTROL_AE_MODE。相反,您可以在FLASH_MODE之间切换。下面是我的例子:

代码语言:javascript
复制
  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)
票数 7
EN

Stack Overflow用户

发布于 2017-01-27 11:08:18

您想要的是禁用闪光灯,而不是自动曝光(AE),因此您希望使用CONTROL_AE_MODE_ON而不是CONTROL_AE_MODE_OFF

正如文档中提到的

CONTROL_AE_MODE_ON 相机设备的自动曝光程序是活动的,没有闪存控制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35620400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档