Skip to content

Android.hardware.Camera:Preview

안드로이드에서 카메라 프리뷰를 출력하는 간단한 Activity.

우선, 아래와 같이 권한을 추가한다.

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

아래와 같이 MainActivity.java파일을 수정한다.

package com.example.mediarecordertest;

import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity {

    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
        private SurfaceHolder _holder;
        private Camera _camera;

        public CameraPreview(Context context) {
            super(context);
            // SurfaceHolder.Callback을 설정함으로서
            // Surface가 생성/소멸되었음을 알 수 있다.
            _holder = getHolder();
            _holder.addCallback(this);
            // _holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // 표시할 영역의 크기를 알았으므로 해당 크기로 Preview를 시작합니다.
            // Camera.Parameters params = _camera.getParameters();
            // params.setPreviewSize(width, height);
            // _camera.setParameters(params);
            _camera.startPreview();
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // Surface가 생성되었다면, 카메라의 인스턴스를 받아온 후,
            // 카메라의 Preview 를 표시할 위치를 설정합니다.
            _camera = Camera.open();
            try {
                _camera.setPreviewDisplay(holder);
            } catch (Exception e) {
                _camera.release();
                _camera = null;
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // 다른 화면으로 돌아가면, Surface가 소멸된다.
            // 따라서 카메라의 Preview도 중지해야 한다.
            // 카메라는 공유할 수 있는 자원이 아니기에,
            // 사용하지 않을 경우(액티비티가 일시정지 상태가 된 경우 등) 자원을 반환해야한다.
            _camera.stopPreview();
            _camera = null;
        }
    }

    private CameraPreview _preview = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        _preview = new CameraPreview(this);
        setContentView(_preview);
    }
}

See also

Favorite site

References


  1. Androidhuman_camera_preview.pdf