2014-04-30 84 views
2

我一直在爲android製作一個手電筒應用程序,並遇到了幾個問題,並已能夠解決這些問題。但是現在,當我運行該應用程序時,它會加載到我的HTC上,運行良好,直到我第四次按下手電筒電源按鈕。我可以按一次,它會打開。我第二次按下它,它關閉。我第三次按下它,然後重新開啓。 我按下它的第四個,它不會關閉?幫幫我?如何在手電筒應用程序中關閉手電筒?

public class MainActivity extends Activity { 

    ImageButton powerButton; 
    private Camera camera; 
    private boolean isFlashOn; 
    private boolean hasFlash; 
    Parameters params; 

    @TargetApi(Build.VERSION_CODES.ECLAIR) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    powerButton = (ImageButton) findViewById(R.id.power_button); 

    hasFlash = getApplicationContext().getPackageManager() 
    .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

    if (!hasFlash) { 
     AlertDialog alert = new AlertDialog.Builder(MainActivity.this) 
     .create(); 
     alert.setTitle("Notice"); 
     alert.setMessage("I'm sorry, your device doesn't support flashlight!"); 
     alert.setButton("Done", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      finish(); 
     } 
     }); 
     alert.show(); 
     return; 
    } 

    getCamera(); 

    toggleButtonImage(); 



    powerButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     if (isFlashOn) { 
      turnOffFlash(); 
     } else { 
      turnOnFlash(); 
     } 
     } 
    }); 
    } 


    private void getCamera() { 
    if (camera == null) { 
     try { 
     camera = Camera.open(); 
     params = camera.getParameters(); 
     } catch (RuntimeException e) { 
     Log.e("Failed to open camera. Alert: ", e.getMessage()); 
     } 
    } 
    } 


    public void turnOnFlash() { 
    if (!isFlashOn) { 
     if (camera == null || params == null) { 
     return; 
     } 

     params = camera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(params); 
     camera.startPreview(); 
     isFlashOn = true; 

     toggleButtonImage(); 
    } 

    } 

    private void turnOffFlash() { 
    if (isFlashOn) { 
     if (camera == null || params == null) { 
     return; 
     } 

     params = camera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_OFF); 
     camera.setParameters(params); 
     camera.stopPreview(); 
     isFlashOn = false; 

     toggleButtonImage(); 
    } 
    } 

    private void toggleButtonImage(){ 
    if(isFlashOn){ 
     powerButton.setImageResource(R.drawable.flashlight_on); 
    }else{ 
     powerButton.setImageResource(R.drawable.flashlight_off); 
    } 
    } 

    @Override 
    protected void onDestroy() { 
    super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 
    super.onPause(); 
    turnOffFlash(); 
    } 

    @Override 
    protected void onRestart() { 
    super.onRestart(); 
    } 

    @Override 
    protected void onResume() { 
    super.onResume(); 
    if(hasFlash) 
     turnOffFlash(); 
    } 

    @Override 
    protected void onStart() { 
    super.onStart(); 

    getCamera(); 
    } 

    @Override 
    protected void onStop() { 
    super.onStop(); 

    if (camera != null) { 
     camera.release(); 
     camera = null; 
    } 
    } 

' 清單 - http://pastebin.com/Tw6LTemP ' activity_main.xml中 - http://pastebin.com/Tga1agN7

+0

holy wall-o-codez – Coffee

+1

我知道它的大部分都不是相關的哈哈,但我只是表明清單和一切都應該正確設置。 –

+0

當然......好吧,它有助於縮小和顯示相關的,所有其他的鏈接(pastebin) – Coffee

回答

0

至於您所描述的症狀,它可能是SurfaceView崩潰。請從logcat發佈您的錯誤日誌。

而且,裏面的onResume()你的代碼沒有任何意義,我(雖然,這不是你的問題的直接原因,對你的問題的直接原因,請再次見到你的logcat):

@Override 
protected void onResume() { 
super.onResume(); 
if(hasFlash) 
    turnOffFlash(); 
} 

我想你的意思是說if(isFlashOn)turnOffFlash();但即使你糾正它,這仍然是錯誤的。

+0

是的,(isFlashOn)會更加充足。你會建議我改變onResume()到?這裏是我的logcat的鏈接:http://pastebin.com/sUS3tqDf –

+0

對不起,logcat並沒有告訴我們什麼是錯的。此時,我只需在hasFlash/isFlashOn上設置一個斷點,並通過它來查看結果值是否與您在每個步驟中的期望相符。這會告訴你你需要在onResume()中寫入什麼 –