본문 바로가기

개발 관련 지식/안드로이드(Android)

[안드로이드] 카메라 이용을 위한 SurfaceView

* 카메라 이용을 위한 SurfaceView

 

안녕하세요 송군함대입니다~!^-^/

간만의 포스팅이네요~!! 오늘 포스팅은 간단하게 카메라를 이용하는 방법입니다~!

조금이나마 도움이 되시길 바라며, 아래 내용을 첨부합니다.

 

* SurfaceView 란?

: 다른 View와 마찬가지로 컨텐츠를 표시할 수 있는 View 중 하나로써, 다른 View와 달리 직접 SurfaceView 가 컨텐츠를 표시하지 않고 SurfaceView 내의 Surface 객체가 표시해준다.

 일반적인 View는 화면에 표시하는 연산 등을 하나의 쓰레드에서 처리하게 되어있다. 이를 통해 나타나는 현상이 ANR(Application Not Responding) 이다. ANR 은 어플리케이션이 5초 이상 동작을 멈췄을때(GUI 업데이트가 5초 이상 멈춘 경우), 해당 현상을 확인할 수 있다.

 Surface 의 경우에는 실시간으로 카메라로부터 받은 화상을 지속적으로 업데이트를 해야 하므로, 화면 업데이트를 백그라운드 쓰레드로 수행하여 어플리케이션의 자원을 잠식하지 않고 원할하게 뷰를 업데이트 해준다.

 

 

* SurfaceView 를 이용한 카메라 이용 예제

: SurfaceView 를 이용하기 위해 상속받고, SurfaceHolder.Callback을 설정하여 Sureface 가 생성, 소멸되었는지를 확인할 수 있다.

이를 이용하기 위해서는 surfaceCreated, surfaceDestroyed, surfaceChanged 메소드를 구현해주어야 한다. 이름에서 알 수 있듯이 surface 생성, 소멸, 변경에 따른 메소드들이다.

 아래 예제는 카메라에 담긴 모습을 화면에 뿌려주는 예제이다. 간단한 예제이니, 그리 어렵지 않게 구현할 수 있을 것이다.

 구현 하기 전에 먼저 카메라를 사용하기 위한 권한을 아래와 같이 선언해주는 것을 잊지 말자~!!

 

[예제]

<AndroidManifest.xml>

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

=> 위의 두 가지 권한을 추가해준다.

 

<CameraViewAppActivity.java>

public class CameraViewAppActivity extends ActionBarActivity {
 
 private Preview mPreview;

 class Preview extends SurfaceView implements SurfaceHolder.Callback {
  Camera mCamera;
  SurfaceHolder mHolder;

  public void close() {
   if (mCamera != null) {
    mCamera.setPreviewCallback(null);
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
   }
  }

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

   if (mCamera == null) {
    mCamera = Camera.open();
   }

   mHolder = getHolder();
   mHolder.addCallback(this);
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub
   Camera.Parameters parameters = mCamera.getParameters();
   parameters.setPreviewSize(width, height);
   mCamera.setParameters(parameters);
   mCamera.startPreview();
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   try {
    if (mCamera == null) {
     mCamera = Camera.open();
    }

    if (mCamera != null) {
     mCamera.setPreviewDisplay(holder);

     Camera.Parameters parameters = mCamera.getParameters();
     mCamera.setParameters(parameters);
     mCamera.startPreview();
    }

   } catch (IOException e) {
    // TODO Auto-generated catch block
    if (mCamera != null) {
     mCamera.release();
     mCamera = null;
    }
   }
  }

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

 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  mPreview = new Preview(this);
  
  setContentView(mPreview);
 }

}