如何在相机预览开启时(以编程方式)保持手电筒开启

Posted

技术标签:

【中文标题】如何在相机预览开启时(以编程方式)保持手电筒开启【英文标题】:How to keep the flashlight on (programmatically) while the camera preview is ON 【发布时间】:2019-06-06 00:13:39 【问题描述】:

因此,对于我的 android 应用,我创建了一个 SurfaceView 并将其指定为相机预览,并使用必要的 API 启动相机预览。但现在我想在预览工作时打开手电筒(有点像手电筒)。

请注意,我在网上看到了大量关于如何打开手电筒的示例,只要我不调用开放式相机 API,它就可以工作。下面是代码 -

try

    CameraManager cameraManager = (CameraManager)context.GetSystemService(Context.CameraService);
    if (cameraManager != null)
    
        //for the sake of brevity, hardcoded the camera id. 0 is mostly back camera
        cameraManager.SetTorchMode(0, true); 
    

catch (CameraAccessException e)

   LogUtil.Error("CameraInput", e.ToString());
 

请注意,我正在 Android N 上进行测试,因此上述代码可以完美运行。但是只要我调用下面的代码行,闪光灯就会关闭。

Camera camera = Camera.Open(0);
// ...... some code  ....//
camera.StartPreview();

当上述2行执行时,闪光灯熄灭。这是一种已知的行为,例如相机对闪存硬件进行独占锁定并将其值重置为默认值。

我尝试反转上面的代码,即首先调用 Camera Open API,然后设置闪光灯。我得到 CameraAccessException ,相机已经在使用中。

我错过了什么?

【问题讨论】:

【参考方案1】:

SurfaceView上预览时试试这个

params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_ON);
camera.setParameters(params);

请记住,如果您想将其用作手电筒,您可以这样做:

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);

如果没有,要打开拍照时会出现的闪光灯,请使用:

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);

编码愉快!

【讨论】:

我昨天确实试过了,但我肯定错过了一些东西,因为当时它不起作用。但是自从你的回答之后,我又试了一下,瞧。【参考方案2】:

弄清楚如何在相机预览时打开和关闭手电筒。 On 按钮单击以打开/关闭灯,使用此代码:

//at some other function where camera is initialised and start preview
//...
Camera camera = Camera.open();
camera.startPreview();
//...
boolean lightOn = false;
//...

buttonLight.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
                Camera.Parameters p = camera.getParameters();

                if (!lightOn) 
                    lightOn = true;
                    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                    camera.setParameters(p);
                 else 
                    lightOn = false;
                    p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                    camera.setParameters(p);
                
        
    );

编码愉快! :D

【讨论】:

以上是关于如何在相机预览开启时(以编程方式)保持手电筒开启的主要内容,如果未能解决你的问题,请参考以下文章

计算最佳相机预览尺寸的正确方法保持纵横比

我需要啥权限才能在相机预览中使用相机闪光灯?

怎样设置vivo手机应用添加快捷键?

使用相机时如何打开/关闭手电筒?

设置缩小的相机预览以相对于宽度具有正确的图像纵横比

Android开启手电筒功能(完美适配Android4x,5x,6x)