2014-02-18 185 views
0

我正在實施可以正常工作的閃光燈功能(LED相機閃光燈開啓/關閉),我發生的問題是打開/關閉在不同設備中具有不同的頻率。在HTC SensationXE中,它的閃爍速度很快,而在NEXUS中,其閃爍的慢速不知道問題所在。任何人都可以幫助請: 這裏是代碼:在相同頻率閃爍的Android上實施閃光燈(閃光燈閃爍)效果

/* 
* 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); 
      } 
     } 
    } 
}; 

我的班級FPGA實現SurfaceHolder.Callback

回答

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-nowtime-wanted。這樣,一個循環相對於另一個循環執行的速度之間的任何變化都將被忽略。該代碼總是會計算出下一次切換的時間,然後等待。因此,在很長一段時間內,費率應該是正確的,但個別開啓和關閉時間可能稍微不準確。

+0

非常感謝你的幫助,它是如此的你。我會嘗試 –