날마다 새롭게 또 날마다 새롭게

카메라 Preview 띄우기 본문

프로그래밍/Android

카메라 Preview 띄우기

아무유 2012. 11. 20. 09:36

1. Manifest - 카메라를 사용하겠다는 Permission 받기

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

 

2. Main.java - Camera 객체 생성 및 영상 Preview 띄우기 

// 미리보기 표면 클래스
 class MyCameraSurface extends SurfaceView implements SurfaceHolder.Callback {

  SurfaceHolder mHolder;
  Camera mCamera;

 

① Surface Class 생성 (SURFACE_TYPE_PUSH_BUFFERS 설정)

   public MyCameraSurface(Context context, AttributeSet attrs) {
   super(context, attrs);
   mHolder = getHolder();
   mHolder.addCallback(this);
   mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }

 

② Camera 객체 생성 및 미리보기 설정

public void surfaceCreated(SurfaceHolder holder){
       mCamera = Camera.open();
   try {
    mCamera.setPreviewDisplay(mHolder);
   } catch (IOException e) {
    // TODO Auto-generated catch block
    mCamera.release();
    mCamera = null;
    e.printStackTrace();
   }    

  }

 

③ Surface 크기에 맞는 최적의 미리보기 크기 설정

@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
Camera.Parameters params = mCamera.getParameters();
List<Size> arSize = params.getSupportedPictureSizes();
if(arSize == null){
params.setPreviewSize(width, height);
} else {
int diff = 10000;
Size opti = null;
for(Size s : arSize){
if(Math.abs(s.height - height)<diff){
diff = Math.abs(s.height - height);
opti = s;
}

}
params.setPreviewSize(opti.width, opti.height);
}
mCamera.setParameters(params);
mCamera.startPreview();

}

 

④ Surface 해제 시 카메라도 해제
  public void surfaceDestroyed(SurfaceHolder holder){
   if(mCamera != null) {
    mCamera.stopPreview();
    mCamera.release();
    mCamera=null;
   }
  }
 }


 

Comments