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

onBackPressed후에 다시 액티비티 실행시키면 오류나네요.

0 추천
메인에서 activityB로 이동한다고 할때

처음에는 잘 돌아가는데

뒤로가기 버튼으로 다시 메인으로 돌아오고 난후에

다시 activityB로 이동하려고 하면 오류나면서 꺼지네요.

 

메인은 단순히 버튼만 있고

activityB는 카메라 프리뷰가 구현되어 있습니다.

프레임레이아웃에 서페이스뷰깔고 위에 카메라 프리뷰 실행시켜서

저장되면 비트맵 이미지로 저장되는데. 코드가 필요할지 모르겠지만

일단 올리겠습니다.

public class CameraActivity extends Activity {

 public static String IMAGE_FILE = "capture.jpg";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
       
        final CameraSurfaceView cameraView = new CameraSurfaceView(getApplicationContext());
        FrameLayout previewFrame = (FrameLayout) findViewById(R.id.previewFrame);
        previewFrame.addView(cameraView);

        Button saveBtn = (Button) findViewById(R.id.saveBtn);
        saveBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                cameraView.capture(new Camera.PictureCallback() {
                    public void onPictureTaken(byte[] data, Camera camera) {
                        try {
                            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                            String outUriStr = MediaStore.Images.Media.insertImage(getContentResolver(),
                              bitmap, "Captured Image", "Captured Image using Camera.");

                            if (outUriStr == null) {
                                Log.d("SampleCapture", "Image insert failed.");
                                return;
                            } else {
                                Uri outUri = Uri.parse(outUriStr);
                                sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, outUri));
                            }

                            Toast.makeText(getApplicationContext(), "카메라로 찍은 사진을 앨범에 저장했습니다.", Toast.LENGTH_LONG).show();

                            // restart
                            camera.startPreview();
                        } catch (Exception e) {
                            Log.e("SampleCapture", "Failed to insert image.", e);
                        }
                    }
                });
            }
        });

    }

   public static Bitmap rotate(Bitmap b, int degrees) {
     if ( degrees != 0 && b != null ) {
     Matrix m = new Matrix();
     m.setRotate( degrees, (float) b.getWidth() / 2, (float) b.getHeight() / 2 );
     try {
     Bitmap b2 = Bitmap.createBitmap( b, 0, 0, b.getWidth(), b.getHeight(), m, true );
     if (b != b2) {
     b.recycle();
     b = b2;
     }
     } catch (OutOfMemoryError ex) {
     // We have no memory to rotate. Return the original bitmap.
     }
     }
     return b;
     }

    private class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
        private SurfaceHolder mHolder;
        private Camera camera = null;

        public CameraSurfaceView(Context context) {
            super(context);

            mHolder = getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
        public void surfaceCreated(SurfaceHolder holder) {
           camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
            try{
            
             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
              camera.setDisplayOrientation(90);
             } else {
              Parameters parameters = camera.getParameters();
              parameters.setRotation(90);
              camera.setParameters(parameters);
             }
             camera.setPreviewDisplay(mHolder);
            } catch(Exception e) {
             Log.e("CameraSurfaceView", "Failed to set camera preview.", e);
            }
           }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
         camera.startPreview();
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            camera.stopPreview();
            camera = null;
        }

        public boolean capture(Camera.PictureCallback handler) {
            if (camera != null) {
                camera.takePicture(null, null, handler);
                return true;
            } else {
                return false;
            }
        }

    }

 @Override
 public void onBackPressed() {
  // TODO Auto-generated method stub
  Toast.makeText(getApplicationContext(), "뒤로 가기 눌려짐.", Toast.LENGTH_SHORT).show();
  Log.d("onBackPressed", "뒤로가기 눌려짐");
  super.onBackPressed();
 }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
   
}
라쿠나피토 (140 포인트) 님이 2013년 4월 19일 질문

1개의 답변

0 추천
오류로그를 보여주시면 알 수 있을 꺼 같은데요.

mainActivity에서 startActivity(activityB); 타기전에 오류가 나는지?

activityB에서 에러가 난다면 몇번째 줄에서 에러나는지 보시면 될꺼 같습니다.

아니시면 onBackPressed()에서 finish() 시켜 버리시던지 onPause()에서 생성하신 클래스 null을 해주시던지

하시면 되지 않을까 생각합니다.
앙스 (1,020 포인트) 님이 2013년 4월 23일 답변
오류 로그입니다.



04-24 14:55:04.126: D/AudioManager(27854): preDispatchKeyEvent()... keyCode = 4, stream = -2147483648
04-24 14:55:04.196: I/touchCheck(27854): ViewRoot's Key event KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x48, repeatCount=0, eventTime=406287744, downTime=406287665, deviceId=3, source=0x101 }
04-24 14:55:04.196: D/AudioManager(27854): preDispatchKeyEvent()... keyCode = 4, stream = -2147483648
04-24 14:55:04.206: D/onBackPressed(27854): 뒤로가기 눌려짐
04-24 14:55:04.216: D/Activity(27854): Activity.onPause(), editTextTapSensorList size: 0
04-24 14:55:04.246: D/memalloc(27854): ion: Mapped buffer base:0x5cd37000 size:163840 offset:0 fd:60
04-24 14:55:04.276: I/Adreno200-EGLSUB(27854): <ConfigWindowMatch:2165>: Format RGBA_8888.
04-24 14:55:04.286: D/memalloc(27854): ion: Mapped buffer base:0x5da24000 size:3768320 offset:0 fd:75
04-24 14:55:04.296: D/memalloc(27854): ion: Mapped buffer base:0x5e5ec000 size:3768320 offset:0 fd:84
04-24 14:55:04.306: V/Camera-JNI(27854): stopPreview
04-24 14:55:04.306: V/Camera-JNI(27854): get_native_camera: context=0xb67288, camera=0xb66f00
04-24 14:55:04.316: D/memalloc(27854): ion: Unmapping buffer  base:0x5debc000 size:3768320
04-24 14:55:04.316: D/memalloc(27854): ion: Unmapping buffer  base:0x5e254000 size:3768320
04-24 14:55:04.316: D/memalloc(27854): ion: Unmapping buffer  base:0x5ed1c000 size:3768320
04-24 14:55:04.907: I/touchCheck(27854): ViewRoot's Touch Event : MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=461.35922, y[0]=298.7666, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=406288465, downTime=406288465, deviceId=3, source=0x1002 }
04-24 14:55:04.927: D/memalloc(27854): ion: Mapped buffer base:0x5debc000 size:3768320 offset:0 fd:61
04-24 14:55:04.977: I/touchCheck(27854): ViewRoot's Touch Event : MotionEvent { action=ACTION_UP, id[0]=0, x[0]=461.35922, y[0]=298.7666, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=406288517, downTime=406288465, deviceId=3, source=0x1002 }
04-24 14:55:04.977: D/Activity(27854): Activity.onPause(), editTextTapSensorList size: 0
04-24 14:55:05.047: I/Adreno200-EGLSUB(27854): <ConfigWindowMatch:2165>: Format RGBA_8888.
04-24 14:55:05.057: D/memalloc(27854): ion: Mapped buffer base:0x5e254000 size:3768320 offset:0 fd:64
04-24 14:55:05.067: I/LGMDMUICameraAdapter(27854): Camera open, camPid = 27854
04-24 14:55:05.067: I/LGMDMUICameraAdapter(27854): getCameraDisabled = false
04-24 14:55:05.077: W/dalvikvm(27854): threadid=1: thread exiting with uncaught exception (group=0x411f79d8)
04-24 14:55:05.077: E/AndroidRuntime(27854): FATAL EXCEPTION: main
04-24 14:55:05.077: E/AndroidRuntime(27854): java.lang.RuntimeException: Fail to connect to camera service
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.hardware.Camera.native_setup(Native Method)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.hardware.Camera.<init>(Camera.java:321)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.hardware.Camera.open(Camera.java:277)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at com.example.test.CameraActivity$CameraSurfaceView.surfaceCreated(CameraActivity.java:110)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.view.SurfaceView.updateWindow(SurfaceView.java:592)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.view.SurfaceView.access$000(SurfaceView.java:87)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:181)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1623)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2454)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.os.Looper.loop(Looper.java:137)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at android.app.ActivityThread.main(ActivityThread.java:4482)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at java.lang.reflect.Method.invokeNative(Native Method)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at java.lang.reflect.Method.invoke(Method.java:511)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
04-24 14:55:05.077: E/AndroidRuntime(27854):     at dalvik.system.NativeStart.main(Native Method)
...