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
-
Android_save_camera_picture.pdf ↩