본문 바로가기
프로그래밍/Android

안드로이드 Camera의 영상 출력하기

by Daniel.kwak 2018. 12. 5.

항상 정리되지 않았던 부분이라 짚고 넘어간다.


이번 장의 목표는 Camera 영상을 저번에 만든 Surface에 뿌려주는 것.


SurfaceView의 코드에서 Camera 객체를 추가하여 preview까지 하는 코드를 우선 살펴보자. 



public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback  {

    SurfaceHolder mHolder;
    Camera mCamera;


    public MySurfaceView(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open();
        try{
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e){
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(width , height);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera = null;

    }
}



1.먼저 멤버변수로 Camera객체를 추가한다. (API21 이후로는 deprecated 되었고 camera2 사용을 권장한다고 한다.)

Camera를 초기화 하는 부분은 surfaceCreated에서 해준다. surface가 생성되면서 camera도 생성하여 같이 초기화를 해줘야 하기 때문이다. 

mCamera.open() -> mCamera.setPreviewDisplay(mHolder) 순서로서, 카메라를 얻어오고 카메라를 보여줄 surfaceHolder를 지정한다. 




그 다음은 예외처리 부분으로, 카메라 객체를 정상적으로 얻어오지 못했을때 처리이다. 카메라는 여러 곳에서 공유할 수 있는 자원이 아니므로 카메라 사용이 끝나면 release()를 통해 자원을 반환해야 한다. 


2.다음은 surfaceDestroy부분이다.

surfaceView가 종료되면서 자연스럽게 카메라도 preview를 멈추고 카메라 객체를 소멸시켜준다. 


3.surfaceChanged에서는 실질적으로 camera의 preview영상을 뿌려주는 곳이다.

파라미터로 표시할 영역의 width, height이 들어오면 카메라의 출력할 사이즈도 이와 같이 set을 해주고 startPreview하면 카메라가 출력된다.



Camera의 주요 메소드

1.


현재 단말기에 연결된 특정 카메라의 객체를 생성한다. 만약 같은 카메라가 열려있다면 RuntimeException이 발생한다. 사용이 끝나면 반드시 release()를 호출하여 다른 application이 사용할 수 있게 해야한다. (공유자원이 결코 아님) 
앱은 반드시 하나의 특정한 카메라 객체만 사용할 수 있다. 


2.
카메라 객체의 연결을 끊고 자원을 해제한다. 
카메라 사용이 끝남과 동시에 즉시 호출해야 한다.



3.

라이브 프리뷰에 쓸 surface를 셋팅한다. surface나 surfaceTexture는 프리뷰를 위해 반드시 필요하며, 프리뷰는 사진을 찍기 위해 반드시 필요하다. 
preview를 하기 전에 반드시 surfaceCreated에서 mHolder를 셋팅해야 한다. 


정리하면
SurfaceView 안에서 mHolder 설정 -> 카메라의 프리뷰를 띄울 surface의 SurfaceHolder를 surfaceCreated에서 지정.



출처: 커니의 안드로이드 

'프로그래밍 > Android' 카테고리의 다른 글

안드로이드 방향 전환  (0) 2018.12.06
안드로이드 컴포넌트  (0) 2018.12.06
안드로이드 AlaramManager  (0) 2018.12.05
Android Material CalendarView  (1) 2018.12.05
Android SurfaceView  (0) 2018.12.04
안드로이드 쓰레드(1)  (0) 2018.11.12