在后置摄像头上制作LED灯的更好方法是什么?

时间:2014-03-18 03:31:55

标签: android

我试图使我的后置摄像头上的LED灯每N秒闪烁一次:

private void blink() {
  for (int i = 0; i < 5; i++) {
    turnOnLedLight();
    try {
       Thread.sleep(1000); // N = 1 second
    }
    catch (InterruptedException e) {
       Log.e("Test", "Got interrupted.");
    }
    turnOffLedLight();
  }
}

private static Camera camera = null;

private void turnOnLedLight() {
  camera = Camera.open();
  Parameters p = camera.getParameters();
  p.setFlashMode(Parameters.FLASH_MODE_TORCH);
  camera.setParameters(p);
  camera.startPreview();
}

private void turnOffLedLight() {
  camera.stopPreview();
  camera.release();
  camera = null;
}

上面的代码有效,但除了让线程进入睡眠状态之外还有更好的方法吗? blink方法在doInBackground中的AsyncTask方法中调用。

更新

我意识到上面的代码使LED灯保持亮起N秒。我想知道是否有更好的方法让它保持N秒并保持N秒。

3 个答案:

答案 0 :(得分:2)

我会通过alarmManager报警。你正在举起AsyncTask线程。从3.0开始,异步任务都共享一个线程并循环执行。这意味着在您有任何其他异步任务时,它将被阻止。此外,如果手机进入睡眠状态,警报会唤醒手机,如果手机在你的线程中进入睡眠状态,线程将暂停,并且会在当前闪烁状态下冻结,直到用户将其唤醒。

当你第一次想要相机时,我也会做一次Camera.open,当你不再需要它时释放它,而不是在每个turnOnLedLight中请求它(导致你获得并释放相机5次) )。现在,如果有人在您关闭时更换了应用程序并打开相机应用程序,您可能会被锁定无法再次使用相机(并且可能会崩溃)。

答案 1 :(得分:0)

如果您想让它更准确,可以使用System.currentTimeMillis(),例如:

long previousTimeMillis = System.currentTimeMillis();
int i = 0;
while(i < 5){
    if(System.currentTimeMillis() - previousTimeMillis >= 1000){
        turnOffLedLight();
        previousTimeMillis = System.currentTimeMillis();
        i++;
    }else{
        turnOnLedLight();
    }
}

这就是你可以做些什么来让led保持开启和关闭N秒:

long previousTimeMillis = Sustem.currentTimeMillis();
boolean shouldTurnOnLight = true;
int i = 0;
while(i < 5){
    if(System.currentTimeMillis() - previousTimeMillis >= 1000){
        if(shouldTurnOnLight){
            turnOnLedLight();
            shouldTurnOnLight = false;
        }else{
            turnOffLedLight();
            shouldTurnOnLight = true;
        }
        previousTimeMillis = System.currentTimeMillis();
        i++;
    }
}

答案 2 :(得分:0)

如果你的开/关周期是对称的,那么这是另一种方法:

public Boolean ledOn = false;

...

// Change the LED state once a second for 5 minutes:
CountDownTimer cdt = new CountDownTimer(30000, 1000) {

    public void onTick(long millisUntilFinished) {
        ledOn = !ledOn;

        if (ledOn)
            turnOffLedLight();
        else
            turnOnLedLight();
    }

    public void onFinish() {
        Log.d(TAG, "LED is on? "+ ledOn.toString());
    }

 };

...

cdt.start();

...

cdt.cancel();

(编辑为更好地处理开始/停止。)