我正在实现能够正常工作的频闪功能(LED相机闪光灯打开/关闭)我发生的问题是在不同设备中以不同频率打开/关闭。在HTC SensationXE中它快速闪烁并且在NEXUS中闪烁缓慢不知道问题是什么。任何人都可以帮助请: 这是代码:
/*
* This method turn on the LED camera flash light
*/
public void flashLightOn() {
Log.d("Time", "On");
if (!isFlashOn) {
if (cam != null || params != null) {
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(params);
cam.startPreview();
isFlashOn = true;
} else {
cam = Camera.open();
params = cam.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(params);
cam.startPreview();
isFlashOn = true;
}
}
else{
return;
}
}
/*
* This method turn off the LED camera flash light
*/
public void flashLightOff() {
Log.d("Time", "Off");
if (isFlashOn) {
if (cam != null || params != null) {
//params.setFlashMode(Parameters.FLASH_MODE_OFF);
//cam.setParameters(params);
cam.stopPreview();
isFlashOn = false;
}
else{
//params = cam.getParameters();
//params.setFlashMode(Parameters.FLASH_MODE_OFF);
//cam.setParameters(params);
cam.stopPreview();
isFlashOn = false;
}
}
else{
return;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mHolder = holder;
try {
cam.setPreviewDisplay(mHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
cam.stopPreview();
mHolder = null;
}
private final Runnable mRunnable = new Runnable() {
public void run() {
if (mActive) {
if (mSwap) {
flashLightOn();
mSwap = false;
mHander.postDelayed(mRunnable, strobeOnDelay);
} else {
flashLightOff();
mSwap = true;
mHander.postDelayed(mRunnable, strobeOffDelay);
}
}
}
};
我的课程是实施SurfaceHolder.Callback
答案 0 :(得分:2)
run
方法使用固定参数调用延迟操作。这意味着延迟将占用计算机上其他所有内容的处理时间加上延迟时间。 “其他所有内容”在您的代码中可能看起来很小而且很快,但它也包括所有其他进程争用处理器时间等的工作。
您的代码简化为:
LoopForever
Do some processing to toggle light ON or OFF;
Delay for a fixed time;
EndLoop
处理常规活动的常用方法如下:
LoopForever
Do some processing to toggle light ON or OFF;
Calculate time interval until next toggle wanted.
Delay for the calculated interval;
EndLoop
请注意,时间间隔的计算将参考时钟,并将time-now
与time-wanted
进行比较。这样,将忽略一个循环执行的速度与另一个循环执行速度之间的任何变化。代码总是计算出下一个切换所需的时间,并等到那时为止。因此,在很长一段时间内,速率应该是正确的,尽管单独的ON和OFF时间可能稍微不准确。