ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android SurfaceView 를 통한 Camera 표시
    안드로이드 Study 2011. 7. 20. 14:42
    반응형
    SurfaceView를 이용하여 카메라에 보이는 화면을 만들 수 있다.
    증강현실 어플들은 이를 기반으로 만들어 지는 것으로 알고 있다.


    CameraTest.java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        CameraView cv = new CameraView(this);
        setContentView(cv);
    }


    CameraView.java

     package com.appbada.mirror;

    import java.io.IOException;

    import android.content.Context;
    import android.hardware.Camera;
    import android.hardware.Camera.CameraInfo;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;

    public class CameraView extends SurfaceView implements Callback {
        Camera camera = null;
        SurfaceHolder holder = null;
     
        public void init(){
            holder = getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
     
        public CameraView(Context context) {
             super(context);
             init();
        }
     
        public CameraView(Context context, AttributeSet attr) {
            super(context, attr);
            init();
        }
     
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
      
            if(camera != null) {
                Camera.Parameters params = camera.getParameters();
                params.setPreviewSize(width, height);
                camera.startPreview();
            }
        }
     
        @Override
        public void surfaceCreated(SurfaceHolder holder)  {
            int cameraId = 0;
            /* 카메라가 여러개 일 경우 그 수를 가져옴  */
            int numberOfCameras = Camera.getNumberOfCameras();
            CameraInfo cameraInfo = new CameraInfo();
      
            for(int i=0; i < numberOfCameras; i++) {
                Camera.getCameraInfo(i, cameraInfo);

                /* 전면 카메라를 쓸 것인지 후면 카메라를 쓸것인지 설정 시 */
                /* 전면카메라 사용시 CAMERA_FACING_FRONT 로 조건절 */
                if(cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK)
                    cameraId = i;
            }
      
            /* open시 camera id를 주어 선택 */
            camera = Camera.open(cameraId);

            /* surface 사용시 카메라가 회전되어 있어 그에 대한 보정 */
            camera.setDisplayOrientation(90);

            try{
                camera.setPreviewDisplay(holder);
       
            }catch(IOException e){
                e.printStackTrace();
                camera.release();
                camera = null;
            }

        }
     
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if(camera != null) {
                camera.stopPreview();
                camera.release();
                camera = null;
            }
        }
    }


    반응형
Designed by Tistory.