마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

카메라 소스에서 종료할때?

0 추천
카메라 뷰 소스에서 아래와 같이 하면 어플이 비정상적으로 종료가 됩니다

    @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
        try {
            mCamera.stopPreview();
            mCamera = null;
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
        if(D) Log.e(TAG, "--- ON DESTROY ---");
 }

/////////////////////////

public class MainActivity extends Activity {

   Camera mCamera;

   @Override
    protected void onCreate(Bundle savedInstanceState) {

         mPreview = new Preview(this);

        setContentView(mPreview);

   
    }

      class Preview extends SurfaceView implements SurfaceHolder.Callback {

        ..............
         ..............

        ................

        }

}

 

어떻게 하면 정상적으로 종료를 시킬수 잇나요?
헨씀히포 (3,660 포인트) 님이 2013년 12월 24일 질문

1개의 답변

0 추천
 
채택된 답변
카메라의 release() 메소드를 호출해 주세요.
원조안드로이드 (58,190 포인트) 님이 2013년 12월 24일 답변
헨씀히포님이 2013년 12월 26일 채택됨
protected void onDestroy() {
   mCamera.release();
}

이렇게 해봣는데 종료할때 에러가 납니다
왜 그럴까요?
에러가 날 때의 로그를 보여 주셔야 확인이 가능할 듯 합니다.
일반적으로 에러나는 상황은 아니니.
 아무래도 다른 쓰레드가 동작 하고 있고  거기서 종료된 카메라 메소드를 accecss 하려다 오류가 나는 것으로 추정됩니다.
12-24 15:02:41.430: E/AndroidRuntime(19800): FATAL EXCEPTION: main

12-24 15:02:41.430: E/AndroidRuntime(19800): java.lang.RuntimeException: Unable to destroy activity {com.lumiscancolor/com.lumiscancolor.MainActivity}: java.lang.NullPointerException

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3664)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.ActivityThread.access$1300(ActivityThread.java:165)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1379)
12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.os.Handler.dispatchMessage(Handler.java:99)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.os.Looper.loop(Looper.java:176)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.ActivityThread.main(ActivityThread.java:5455)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at java.lang.reflect.Method.invokeNative(Native Method)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at java.lang.reflect.Method.invoke(Method.java:525)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at dalvik.system.NativeStart.main(Native Method)

12-24 15:02:41.430: E/AndroidRuntime(19800): Caused by: java.lang.NullPointerException

12-24 15:02:41.430: E/AndroidRuntime(19800):     at com.lumiscancolor.MainActivity.onDestroy(MainActivity.java:165)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.Activity.performDestroy(Activity.java:5543)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1134)

12-24 15:02:41.430: E/AndroidRuntime(19800):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3629)
12-24 15:02:41.430: E/AndroidRuntime(19800):     ... 11 more
=======================================================
com.lumiscancolor.MainActivity.onDestroy(MainActivity.java:165)
이쪽부분은 mCamera.release()입니다
로그 상은   MainActivity.java 165 라인에서 NullPointerException 이 발생했네요.
아마  다른 곳( onPause 등)에서 카메라를 종료 하고 이미 null로 만들었는데. mCamera.release(); 가 호출 된게 아닌 듯 합니다.
해당 부분의  Exception 처리가 IOException만 되어 있던데 NullPointerException 도 처리 해주시던지 mCamera 가 null 일 경우 release() 를 호출 하지 않도록 해 주셔야 할 듯 합니다.
try{
    mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
}catch(NullPointerException e){
    e.printStackTrace();
}
위와 같이 했더니 아래와같은 에러가 발생하면서 기존과 똑같은 비정상적으로 종료가 되었습니다
       
12-24 15:19:44.381: E/YI13N(5607): Illegal ULT key: _do. Keys cannot start with '_'.

12-24 15:19:44.381: E/YI13N(5607): Illegal ULT key: _E. Keys cannot start with '_'.

12-24 15:19:44.381: V/PackageManager(2353): getApplicationInfo com.samsung.android.MtpApplication: Package{42e73e48 com.samsung.android.MtpApplication}

12-24 15:19:44.381: V/PackageManager(2353): getApplicationInfo com.android.providers.media: Package{435d49f0 com.android.providers.media}

12-24 15:19:44.386: I/InputReader(2353): Touch event's action is 0x1 (deviceType=0) [pCnt=1, s=] when=3131940267000

12-24 15:19:44.386: I/InputDispatcher(2353): Delivering touch to: action: 0x1
12-24 15:19:44.391: I/Process(21120): Sending signal. PID: 21120 SIG: 9

12-24 15:19:44.411: V/PackageManager(2353): getApplicationInfo com.samsung.android.MtpApplication: Package{42e73e48 com.samsung.android.MtpApplication}

12-24 15:19:44.411: V/PackageManager(2353): getApplicationInfo com.android.providers.media: Package{435d49f0 com.android.providers.media}

12-24 15:19:44.416: W/InputDispatcher(2353): channel ~ Consumer closed input channel or an error occurred.  events=0x9

12-24 15:19:44.416: E/InputDispatcher(2353): channel ~ Channel is unrecoverably broken and will be disposed!

12-24 15:19:44.416: I/ActivityManager(2353): Process com.lumiscancolor (pid 21120) (adj 13) has died.

12-24 15:19:44.416: D/STATUSBAR-StatusBarManagerService(2353): manageDisableList what=0x0 pkg=WindowManager.LayoutParams

12-24 15:19:44.416: D/RestrictionPolicy(2353): isStatusBarExpansionAllowed : true
12-24 15:19:44.431: D/SecCameraCoreManager(1956): disableMsgType: 0xffffffff

12-24 15:19:44.431: D/SecCameraCoreManager(1956): stopPreview
12-24 15:19:44.431: D/ShotSingle(1956): stopPreview
12-24 15:19:44.431: V/ShotSingle(1956): stopPreview(0)

12-24 15:19:44.431: D/ISecCameraHardware(1956): stopPreview E
12-24 15:19:44.431: W/ISecCameraHardware(1956): stopPreview: warning, preview has been stopped

12-24 15:19:44.431: D/SecCameraCoreManager(1956): cancelPicture
12-24 15:19:44.431: D/ISecCameraHardware(1956): cancelPicture EX

12-24 15:19:44.431: D/SecCameraCoreManager(1956): release

12-24 15:19:44.431: D/SecCameraCoreManager(1956): virtual void android::SecCameraCoreManager::release(): release IT policy checking thread

12-24 15:19:44.431: D/SecCameraHardware(1956): release E

12-24 15:19:44.431: D/ISecCameraHardware(1956): Camera.... release

12-24 15:19:44.431: W/InputDispatcher(2353): Attempted to unregister already unregistered input channel

12-24 15:19:44.436: D/KeyguardViewMediator(2353): isInputRestricted(), mShowing = false, mNeedToReshowWhenReenabled = false

12-24 15:19:44.436: D/KeyguardViewMediator(2353): isInputRestricted(), isDeviceProvisioned = true
로그로는 모르겠습니다. 처음 말씀드린대로 다른 쓰레드에서 카메라 리소스를 잡고 있어서 종료가 제대로 안 되었거나. 처음 실행시 카메라가 제대로 생성이 안되었을 것으로 추정이 됩니다만. 알 수가 없네요..  카메라를 사용하는 부분에서 필요없는 부분을 주석하여 정상 동작 되는 상태로 만드신 후 한개씩 다시 추가해가면서 충돌 나는 부분을 찾으시길 권장합니다.
어떻게 되엇던 답변 고맙습니다
많은 도움이 되엇습니다
...