在以相同频率闪烁的安卓上实现频闪(闪光灯闪烁)效果



我正在实现工作正常的频闪功能(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

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-nowtime-wanted进行比较。这样,一个循环与另一个循环的执行速度之间的任何变化都将被忽略。代码始终计算出需要下一个切换的时间并等待到那时。因此,在很长一段时间内,速率应该是正确的,尽管个别的ON和OFF时间可能略有不准确。

最新更新