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

카메라 전방 후방 전환

0 추천

영상 전송 만들고 있습니다.

 

버튼 클릭시 카메라 전환 되는건데

처음 onCreate로 들어와서 생성, 세팅 해주면 잘 받아 오는데

카메라 전환 버튼 클릭시 세팅은 다 되는데

surfaceCreated도 안들어 오고 죽어버립니다.

 

visible로 안하고 새로 생성해도

생성자까지만 들어오고 죽어버립니다. ㅠㅠ

 

왜이럴까요..

특별히 앱에 대한 로그는 뜨지 않습니다.. ㅠㅠㅠ

 

- logcat

E/CAM_FD(169): cam_conf: CAMERA_EXIT
E/QualcommCamera(169): Qint android::set_preview_window(camera_device*, preview_stream_ops*): E window = 0x0
E/QualcommCameraHardware(169): : set_preview_window
E/QualcommCamera(169): Qint android::set_preview_window(camera_device*, preview_stream_ops*): E window = 0x0
E/QualcommCameraHardware(169): : set_preview_window
E/msm8660.hwcomposer(166): Invalid gralloc handle (at 0x599740): ver(1075008992/12) ints(12/12) fds(5756816/2) magic(----/gmsm)
E/QualcommCamera(169): Qint android::close_camera_device(hw_device_t*): device =0x12c8b98 E
E/mm-camera(169): mm_camera_destroy: controlFd is valid 42 0
E/DisplayPP(169): Final_MV[0][0]=1.119145  Final_MV[0][1]=-0.099826 Final_MV[0][2]=-0.019332 
E/DisplayPP(169): Final_MV[1][0]=-0.050818  Final_MV[1][1]=1.070225 Final_MV[1][2]=-0.019421 
E/DisplayPP(169): Final_MV[2][0]=-0.050752  Final_MV[2][1]=-0.099822 Final_MV[2][2]=1.150561 
E/DisplayPP(169): pre_lv[0]=0
E/DisplayPP(169): post_lv[0]=0
E/DisplayPP(169): pre_lv[1]=255
E/DisplayPP(169): post_lv[1]=255
E/DisplayPP(169): pre_lv[2]=0
E/DisplayPP(169): post_lv[2]=0
E/DisplayPP(169): pre_lv[3]=255
E/DisplayPP(169): post_lv[3]=255
E/DisplayPP(169): pre_lv[4]=0
E/DisplayPP(169): post_lv[4]=0
E/DisplayPP(169): pre_lv[5]=255
E/DisplayPP(169): post_lv[5]=255
E/DisplayPP(169): mv[0][0]=0x23d  mv[0][1]=0xffffffcd mv[0][2]=0xfffffff6 
E/DisplayPP(169): pre_bv[0]=0
E/DisplayPP(169): post_bv[0]=0
E/DisplayPP(169): mv[1][0]=0xffffffe6  mv[1][1]=0x224 mv[1][2]=0xfffffff6 
E/DisplayPP(169): pre_bv[1]=0
E/DisplayPP(169): post_bv[1]=0
E/DisplayPP(169): mv[2][0]=0xffffffe6  mv[2][1]=0xffffffcd mv[2][2]=0x24d 
E/DisplayPP(169): pre_bv[2]=0
E/DisplayPP(169): post_bv[2]=0
E/DisplayPP(169): framebuffer 0 not opened!!
E/OverlayLIB(166): overlay closeChannel
E/OverlayLIB(166): decZ: freeing the pipe with zorder = 0 for fbdev = 0
E/OverlayLIB(166): decZ: Pipes in use  = 0

 

 

 

 

- SurfaceView 소스

public class CameraControl extends SurfaceView implements SurfaceHolder.Callback {
 
 private SurfaceHolder mHolder;
 private Camera mCamera;
 
 private boolean mIsFront;

 public CameraControl(Context context, boolean isFront) {
  super(context);
  // TODO Auto-generated constructor stub
  
  mIsFront = isFront;
  
  mHolder = getHolder();
  mHolder.addCallback(this);
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 
 public void setFront(boolean isFront)
 {
  mIsFront = isFront;
 }
 
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  
  openCamera();
  mCamera.setDisplayOrientation(90);
  mCamera.setPreviewCallback(new MyPreviewCallback());
  
  try {
   mCamera.setPreviewDisplay(mHolder);
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   
   mCamera.release();
   mCamera = null;
  }
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  
  mHolder.removeCallback(this);
  mCamera.stopPreview();
  mCamera.release();
  mCamera = null;
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  // TODO Auto-generated method stub
  
  Parameters param = mCamera.getParameters();
  param.setPreviewSize(w, h);
  param.setRotation(90);
  mCamera.setParameters(param);
  mCamera.startPreview();
 }
 
 private void openCamera()
 {  
  int count = Camera.getNumberOfCameras();
  
  for(int i = 0; i < count; i++)
  {
   Camera.CameraInfo info = new Camera.CameraInfo();
   Camera.getCameraInfo(i, info);
   
   if(mIsFront == true && info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
   {
    mCamera = Camera.open(i);
    break;
   }
   else if(mIsFront == false && info.facing == Camera.CameraInfo.CAMERA_FACING_BACK)
   {
    mCamera = Camera.open(i);
    break;
   }
  }
 }

 private class MyPreviewCallback implements PreviewCallback
 {
  
  @Override
  public void onPreviewFrame(byte[] data, Camera camera) {
   // TODO Auto-generated method stub
   //작업
   
  }
 }
}

 

 

- 액티비티 부분 소스

-OnCreate
       
        mLayCamera = (FrameLayout)findViewById(R.id.talk_layout_camera);
       
        mCameraControl = new CameraControl(this, mViewControl, false);       
        mLayCamera.addView(mCameraControl);

 

 

- onClick
      boolean flag = !mCameraControl.isFront();

      mCameraControl.setVisibility(View.GONE);
      mCameraControl.setFront(flag);
      mCameraControl.setVisibility(View.VISIBLE);

 

 

 

익명사용자 님이 2013년 8월 25일 질문

2개의 답변

0 추천
왠지... onClick 메서드에서 카메라 프리뷰를 멈췄다가 설정 후 다시 시작해야 할 것 같은 느낌이 드네요.
Elex (9,090 포인트) 님이 2013년 8월 25일 답변
visible gone으로 설정하면 surfaceDestroyed가 실행되기 때문에 프리뷰 종료 및 해제 작업들을 합니다.
0 추천
문제 되는 코드를 디버깅으로 찾았는데 왜 그러는지 이해가 안됩니다.

 

surfaceCreated에서

mCamera.setDisplayOrientation(90);

 

surfaceDestroyed에서

mHolder.removeCallback(this);

 

이렇게 두 코드 주식 치니까 돌아갑니다.

 

그리고 잘되다가 또 안되길래

surfaceDestroyed를

mCamera.stopPreview();
  mCamera.setPreviewCallback(null);
  mCamera.release();
  mCamera = null;

 

이렇게 고쳤더니 또 됩니다.

 

이상하네요...

어딘가 다른 문제가 있는것 같습니다..
익명사용자 님이 2013년 8월 25일 답변
...