Skip to content

Android.hardware.Camera:Save

안드로이드에서 사진찍고, 저장하는 방법.

우선, 카메라 프리뷰를 위한 SurfaceView를 재정의 해야 한다:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    /** 카메라(화면) 고정 방향. */
    private static final int kCameraDisplayOrientation = 90;

    /** 표면 HOLDER. */
    private SurfaceHolder _holder = null;
    /** 카메라 객체. */
    private Camera _camera = null;
    /** 카메라 ID. */
    private int _cameraId = 0;

    /** 기본 생성자. */
    @SuppressLint("InlinedApi")
    @SuppressWarnings("deprecation")
    public CameraPreview(Context context) {
        super(context);

        _holder = getHolder();
        _holder.addCallback(this);
        _holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        // TODO: 차후, 카메라가 존재하지 않을 경우도 대응해야 한다.
        // Field requires API level 9 (current min is 8):
        // android.hardware.Camera.CameraInfo#CAMERA_FACING_BACK
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            if (Camera.getNumberOfCameras() > Camera.CameraInfo.CAMERA_FACING_BACK) {
                _cameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
            } else {
                _cameraId = 0;
            }
        } else {
            _cameraId = 0;
        }

        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
                _camera = Camera.open(_cameraId);
            } else {
                _camera = Camera.open();
            }

            _camera.setDisplayOrientation(kCameraDisplayOrientation);
        } catch (RuntimeException e) {
            e.printStackTrace();
            _camera = null;
        }
    }

    /** 생성. */
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if (_camera != null) {
            try {
                _camera.setPreviewDisplay(_holder);
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(EditScriptEndingFragment.class.toString(), "Camera.setPreviewDisplay() io exception.");
                _camera.release();
                _camera = null;
            }
        }

        if (_camera != null) {
            Camera.Parameters params = _camera.getParameters();
            // Camera.Parameters setting ...
            _camera.setParameters(params);
            _camera.startPreview();
        }
    }

    /** 변화. */
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    /** 제거. */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (_camera != null) {
            _camera.stopPreview();
            _camera.release();
            _camera = null;
        }
    }

    /** 화상정보를 저장한다. */
    public void shot(final String savePath) {
        if (_camera != null) {
            _camera.takePicture(null, null, new PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    saveData(savePath, data);
                }
            });
        }
    }

    /** 데이터를 파일로 저장한다. */
    private boolean saveData(String path, byte[] data) {
        boolean successSave = false;
        try {
            FileOutputStream fileoutstream = new FileOutputStream(path);
            fileoutstream.write(data);
            fileoutstream.close();
            System.gc();
            // } catch (FileNotFoundException e) {
            // } catch (IOException e) {
        } catch (Exception e) {
            e.printStackTrace();
            successSave = false;
        }
        return successSave;
    }
}

이후, 레이아웃에 뷰를 추가해야 한다:

private CameraPreview _cameraPreview = null;
// ...
_cameraPreview = new CameraPreview(getActivity());
// ...
FrameLayout frame = (FrameLayout) _view.findViewById(R.id.camera_preview_layout);
frame.addView(_cameraPreview);

See also

Favorite site

References


  1. Android_save_camera_picture.pdf