Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在相同频率闪烁的android上实现闪光灯闪烁效果_Java_Android_Camera_Android Camera_Flashlight - Fatal编程技术网

Java 在相同频率闪烁的android上实现闪光灯闪烁效果

Java 在相同频率闪烁的android上实现闪光灯闪烁效果,java,android,camera,android-camera,flashlight,Java,Android,Camera,Android Camera,Flashlight,我正在实施频闪功能,该功能工作正常(LED摄像头闪光灯打开/关闭)。我遇到的问题是,在不同的设备中以不同的频率打开/关闭。在HTC,它的闪烁速度快,而在NEXUS,它的闪烁速度慢,不知道问题出在哪里。有人能帮忙吗 以下是代码: /* * This method turn on the LED camera flash light */ public void flashLightOn() { Log.d("Time", "On"); if (!isFlashOn) {

我正在实施频闪功能,该功能工作正常(LED摄像头闪光灯打开/关闭)。我遇到的问题是,在不同的设备中以不同的频率打开/关闭。在HTC,它的闪烁速度快,而在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);
            }
        }
    }
};

我的类是implementation 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

请注意,时间间隔的计算将参考一天中的时间时钟,并将
现在的时间
需要的时间
进行比较。这样,一个循环执行速度与另一个循环执行速度之间的任何差异都将被忽略。代码总是计算出下一次切换的时间,并一直等到那个时候。因此,在很长一段时间内,费率应该是正确的,尽管个别的开关时间可能有点不准确。

非常感谢先生的帮助,您真是太好了。我试试看