1

私はActivity Life Cycleを処理して懐中電灯アプリケーションを作っています。アプリケーションは正常に動作していますが、onStop()を呼び出すと問題が発生します。懐中電灯がオンのとき、onStop()から戻ると、アプリケーションはフラッシュライトをオンにする必要がありますが、オンではありません。 私はflashOn()メソッドをすべて試しました。懐中電灯を有効にしていません。 onStop()から戻った後に懐中電灯がオンになっていれば、アプリケーションが何もしないことをデバッグからチェックしました。 > onRestart - - > ONSTART -私のAndroidアプリケーションはアクティビティライフサイクルに関して動作していません

public class MainActivity extends AppCompatActivity { 

private ImageButton imagebtn; 
ImageView img; 

private Camera camera; 
private boolean isFlashOn; 
private boolean hasFlash = false; 
private Camera.Parameters params; 

private boolean flag= false; 


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


    imagebtn = (ImageButton) findViewById(R.id.button); 
    img = findViewById(R.id.torchimage); 

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

    if (!hasFlash) { 
     // If device doesn't support flash 
     // Show alert message and close the application 
     AlertDialog alert = new AlertDialog.Builder(MainActivity.this) 
       .create(); 
     alert.setTitle("Error"); 
     alert.setMessage("Sorry, your device doesn't support flash light!"); 
     alert.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 

       finish();//Close application 
      } 
     }); 
     alert.show(); 
    } 


    imagebtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (isFlashOn) { 

       flashOff(); 
      } else { 

       flashOn(); 
      } 
     } 
    }); 
} 


protected void checkCamera() { 
    if (camera == null) { 
     try { 
      camera = Camera.open(); 
      params = camera.getParameters(); 
     } catch (RuntimeException e) { 
      Toast.makeText(getApplicationContext(), "Camera not found", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 


**protected void flashOn() { 
    if (!isFlashOn) { 


     { 
       if (camera == null || params == null) { 
        return; 
       } 

      /*if (flag==true) { 
flag=false; 
       params = camera.getParameters(); 
       params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
       camera.setParameters(params); 
       camera.startPreview(); 
      */} 

     params = camera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(params); 
     camera.startPreview(); 
     isFlashOn = true; 
     toggleImages(); 
     btnSound(); 
    } 
}** 

protected void flashOff() { 
    if (isFlashOn) 
     { 
     if (camera == null || params == null) { 
      return; 
     } 

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

     isFlashOn = false; 
      toggleImages(); 
     btnSound(); 

    } 
} 

protected void btnSound() { 
    final MediaPlayer mp = MediaPlayer.create(this, R.raw.button_sound); 
    mp.start(); 
} 

public void toggleImages() { 
    if (isFlashOn) { 
     imagebtn.setImageResource(R.drawable.button_on); 
     img.setImageResource(R.drawable.torch_on); 
    } else { 
     imagebtn.setImageResource(R.drawable.button_off); 
     img.setImageResource(R.drawable.torch_off); 
    } 
} 

@Override 


protected void onDestroy() { 
     // Toast.makeText(this,"OnDestroy",Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (isFlashOn) 
      flashOn(); 
     else 
      flashOff(); 

    } 

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

      if (isFlashOn==true) 
       flashOn(); 
      else 
       flashOff(); 

    } 

@Override 
protected void onResume() { 
    super.onResume(); 
     if (isFlashOn == true) 
      flashOn(); 
     else 
      flashOff(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    // Toast.makeText(this,"OnStart",Toast.LENGTH_SHORT).show(); 

// if (hasFlash) 
     checkCamera(); 


} 


@Override 
protected void onStop() { 
// Toast.makeText(this, "OnStop", Toast.LENGTH_SHORT).show(); 
    super.onStop(); 
    if (camera != null) { 
     camera.release(); 
     camera = null; 
     flag= true; 

    } 

} 
+0

この場合、ストップに達しましたが、フラッシュには到達していませんか? – sasikumar

+0

懐中電灯がオンのときにonStopが呼び出されたときの@sasikumar。しかし、再起動すると、フラッシュはカメラに表示されません – Wajiha

答えて

0

Androidのライフサイクルで再びhttps://developer.android.com/guide/components/activities/activity-lifecycle.html

を見てくださいそれはonStop行く> onResume

をあなたはがらくたの非常に多くが何をすべき作るあらゆる場所に広がってい見やすく、難しい。

だから...フラッシュがオンです。つまり、isFlashOn = trueです。

あなたがそれにいる間、ブール値== trueをifから削除します。ちょうど(ブーリアン)が動作し、はるかに良いです。

onStop ... camera = null;フラグ=真;

しかしisFlashOnはまだ本当である

onRestart ... ...活動に返した場合(isFlashOn ==真)flashOn(); < ---それはとてもflashOn(に行く、である)

flashOn(){ 場合(!isFlashOn){< -------------ませんBooleanこのように、まだ本当であります実行されていません...カメラはとにかくnullです。

ONSTART ... checkCamera(){ 場合(カメラ== NULL){< ------はい、OK

onResume ... IF(isFlashOn == TRUE)< --- - もう一度同じ問題だから、カメラは決して始まらない。 onStop

で偽

設定isFlashOn =また、履歴書からコードを削除したり、再起動...その2回だけ複製され、同じことを通過します。

デバッグの方法を教えてください。それから学ぶ。

+0

私はあなたが推奨したものを変更しました。しかし、問題は同じです@ cmosBattery 今すぐカメラを取得しません。 – Wajiha

関連する問題