我遇到了类似的问题。用户应能够根据光线情况在录制过程中更改闪光模式以满足他们的需求。经过一些调查研究,我得出以下解决方案:
我假设您已经设置了正确的SurfaceView和带有必要回调的SurfaceHolder。我所做的第一件事是提供以下代码(未声明的变量是全局变量):
public void surfaceCreated(SurfaceHolder holder) { try { camera = Camera.open(); parameters = camera.getParameters(); parameters.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(parameters); camera.setPreviewDisplay(holder); camera.startPreview(); recorder = new MediaRecorder(); } catch (IOException e) { e.printStackTrace(); } }我的下一步是初始化和准备记录器:
private void initialize() { camera.unlock(); recorder.setCamera(camera); recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEnprer(MediaRecorder.AudioEnprer.AAC); recorder.setVideoEnprer(MediaRecorder.VideoEnprer.H264); recorder.setVideoframeRate(20); recorder.setOutputFile(filePath); try { recorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); finish(); } catch (IOException e) { e.printStackTrace(); finish(); }}重要的是要注意,在媒体记录器的整个初始化过程之前,必须先调用camera.unlock()。也就是说,还要注意每个set属性的正确顺序,否则在调用prepare()或start()时会收到IllegalStateException。在录制方面,我会这样做。通常,这将由view元素触发:
public void record(View view) { if (recording) { recorder.stop(); //TODO: do stuff.... recording = false; } else { recording = true; initialize(); recorder.start(); }}所以现在,我终于可以正确录制了。但是那个闪光灯是什么?最后但并非最不重要的是,幕后的魔力来自这里:
public void flash(View view) { if(!recording) { camera.lock(); } parameters.setFlashMode(parameters.getFlashMode().equals(Parameters.FLASH_MODE_TORCH) ? Parameters.FLASH_MODE_OFF : Parameters.FLASH_MODE_TORCH); camera.setParameters(parameters); if(!recording) { camera.unlock(); }}每当我通过onClick动作调用该方法时,即使在录制过程中,我也可以更改闪光模式。只需注意正确锁定相机即可。在录制过程中,如果媒体记录仪要求锁定,则无需再次锁定/解锁摄像机。它甚至不起作用。已在具有Android
4.1.2版的Samsung Galaxy S3上进行了测试。希望这种方法有所帮助。



