如何在相机预览开启时(以编程方式)保持手电筒开启
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
【讨论】:
以上是关于如何在相机预览开启时(以编程方式)保持手电筒开启的主要内容,如果未能解决你的问题,请参考以下文章