2014-03-29 5 views
0

내 앱이 카메라 플래시를 사용하지만 다른 앱을 연 다음 내 앱을 다시 시작하면 앱이 다운되는 이유를 모르겠습니다. 내가 일시 중지 및 응용 프로그램에서 이력서를 삽입하지 않았기 때문에 나는 생각한다.플래시 카메라 충돌

public class MainActivity extends ActionBarActivity { 

//flag to detect flash is on or off 
    private boolean isLighOn = false; 

    private Camera camera; 

    private Button button; 

    private LinearLayout rl; 

    int i=0; 

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

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


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

     button = (Button) findViewById(R.id.buttonFlashlight); 
     rl=(LinearLayout) findViewById(R.id.container); 
     rl.setBackgroundColor(getResources().getColor(R.color.Black)); 


     Context context = this; 
     PackageManager pm = context.getPackageManager(); 

     // if device support camera? 
     if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
      Log.e("err", "Device has no camera!"); 
      return; 
     } 

     camera = Camera.open(); 
     final Parameters p = camera.getParameters(); 

     button.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       if (isLighOn) { 

        Log.i("info", "torch is turn off!"); 

        p.setFlashMode(Parameters.FLASH_MODE_OFF); 
        camera.setParameters(p); 
        camera.stopPreview(); 
        isLighOn = false; 
        button.setBackgroundResource(R.drawable.off); 

        rl.setBackgroundColor(getResources().getColor(R.color.Black)); 

       } else { 

        Log.i("info", "torch is turn on!"); 

        p.setFlashMode(Parameters.FLASH_MODE_TORCH); 

        camera.setParameters(p); 
        camera.startPreview(); 
        isLighOn = true; 
        button.setBackgroundResource(R.drawable.on); 

        rl.setBackgroundResource(R.drawable.check); 

       } 

      } 
     }); 

    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

로그 캣 : 앱이 백그라운드로 이동하게하는 경우

03-29 21:24:51.048: D/AndroidRuntime(27113): Shutting down VM 
03-29 21:24:51.048: W/dalvikvm(27113): threadid=1: thread exiting with uncaught exception (group=0x418eeda0) 
03-29 21:24:51.058: E/AndroidRuntime(27113): FATAL EXCEPTION: main 
03-29 21:24:51.058: E/AndroidRuntime(27113): Process: com.example.torcia, PID: 27113 
03-29 21:24:51.058: E/AndroidRuntime(27113): java.lang.RuntimeException: Method called after release() 
+0

크래시 스택 추적이 유용합니다. – Philio

+0

나는 logcat을 추가했다. – ddd

답변

0

, 중지()가 호출

는 MainActivity입니다. 그런 다음 카메라를 놓습니다. 이 후에 다시 사용할 수 없습니다. camera.open()을 호출하고 새 카메라 객체를 가져와야합니다. onCreate에서 카메라 객체를 만들지 말고 onStart (또는 onResume)에서만 카메라 객체를 만드는 것이 좋습니다.

+0

예를 들어 주시겠습니까? – ddd

0

문제는 응용 프로그램이 중지되었을 때 카메라를 해제하지만 응용 프로그램이 다시 시작될 때 카메라를 다시 초기화하지 않는 것입니다. 카메라 초기화 코드가 onCreate에 있는데 다시 호출되지 않습니다.

카메라를 onResume에서 초기화하고 onPause에서 해제하는 것이 가장 좋습니다.

예.

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

    camera = Camera.open(); 
} 

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

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

예를 들어 주시겠습니까? – ddd

+0

예 – Philio

+0

으로 편집 된 답변 – ddd

관련 문제