1

활동 수명주기를 처리하여 손전등 응용 프로그램을 만들고 있습니다. 응용 프로그램이 잘 실행되고 있지만 onStop()을 호출하면 문제가 발생합니다. 손전등이 켜져있는 동안 onStop()에서 돌아 왔을 때 응용 프로그램이 플래시 라이트를 켜야하지만 그렇지 않습니다. 모든 메서드를 시도했지만 flashOn(); 손전등을 사용할 수 없습니다. onStop()에서 돌아온 후 손전등이 켜져 있다면 응용 프로그램이 아무 것도하지 않는다는 것을 디버깅에서 확인했습니다. > onRestart -가 -가> ONSTART -이 내 안드로이드 응용 프로그램이 활동 수명주기와 관련하여 작동하지 않습니다.

당신은 쓰레기의 엄청 많이 만들고 여기 저기 확산

> onResume 무엇을해야

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

안드로이드 라이프 사이클 https://developer.android.com/guide/components/activities/activity-lifecycle.html

그것은 이동 중지시 다시 봐주세요 쉽게보기는 힘들다.

그래서 ... 플래시가 켜져 있습니다. ie isFlashOn = true;

if에서 부울 == true를 제거합니다. 그냥 (부울) 작동하고 훨씬 낫다면.

onStop ... camera = null; flag = true;

그러나 isFlashOn 여전히 사실이다

onRestart ... ... 활동에 반환 된 경우 (isFlashOn == true)가 flashon는(); <는 --- 그것은 (! isFlashOn가) {<이 ------------- 없음 부울는 여전히이 true의 경우, 그래서 flashon는()

flashon는() { 가고있다 실행되지 않습니다 ... 카메라가 어쨌든 null입니다.

ONSTART ... checkCamera() { 경우 (카메라 == NULL) {< ------ 예, 확인을

onResume ... 경우 (isFlashOn == true)를 < --- - 다시 같은 문제, 그래서 카메라가 시작되지 않습니다.

중지시

거짓

설정 isFlashOn = 또한 ... 이력서에서 코드를 제거하거나 다시 시작의 단지 중복 두 번 같은 일을 겪고.

잘하면 디버깅 방법을 배웁니다. 그것을 배우십시오.

+0

내가 추천 한 바를 수정했습니다. 하지만 문제는 동일합니다 @ cmosBattery 지금 시작 카메라를 가져 오지 않습니다. – Wajiha