마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

카메라 고수님들!!! jpegCallback에서 사진저장이 안됩니다ㅜㅜ 도와주세요!

0 추천

버튼을 클릭할때 촬영음과 잠깐 멈추는 동작이 나오는데 지정해놓은 경로로 사진이 저장되지 않습니다

왜그러는지 고수님들 알려주세요ㅜㅜ

public class CameraActivity extends Activity {
	private Preview pv;
	private Button btn;
	private FrameLayout fl;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		pv = new Preview(this);
		fl = (FrameLayout) findViewById(R.id.preview);
		fl.addView(pv);
		btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// 사진 찍기
				pv.getCamera().takePicture(shutterCallback, rawCallback,
						jpegCallback);
			}
		});
	}

	ShutterCallback shutterCallback = new ShutterCallback() {
		public void onShutter() {
		}
	};
	// raw 파일
	PictureCallback rawCallback = new PictureCallback() {
		public void onPictureTaken(byte[] data, Camera camera) {
		}
	};
	// jpg파일

	PictureCallback jpegCallback = new PictureCallback() {
		public void onPictureTaken(byte[] data, Camera camera) {
			FileOutputStream outStream = null;
			try {
				outStream = new FileOutputStream(String.format(
						"/sdcard/DCIM/%d.jpg", System.currentTimeMillis()));
				outStream.write(data);
				outStream.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	};

	class Preview extends SurfaceView implements SurfaceHolder.Callback {
		private SurfaceHolder mHolder;
		private Camera camera;

		Preview(Context context) {
			super(context);
			mHolder = getHolder();
			mHolder.addCallback(this);
			mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}

		public Camera getCamera() {
			return camera;
		}

		public void surfaceCreated(SurfaceHolder holder) {
			// 카메라 초기화
			try {
				// 전면카메라 사용
				int cameraId = findFrontSideCamera();
				camera = Camera.open(cameraId);

				// 카메라 회전
				// Camera.Parameters parameters = camera.getParameters();
				// if (this.getResources().getConfiguration().orientation !=
				// Configuration.ORIENTATION_LANDSCAPE) {
				camera.setDisplayOrientation(90);
				// }

				// parameters.setRotation(90);
				// parameters.setPreviewSize(640, 480);
				// parameters.setPictureSize(640, 480);
				// camera.setDisplayOrientation(90);
				// camera.setParameters(parameters);
				camera.setPreviewDisplay(holder);
				// camera.startPreview();

				// 미리보기의 프레임을 .setPreviewCallback()으로 새로 정의
				camera.setPreviewCallback(new PreviewCallback() {
					public void onPreviewFrame(byte[] data, Camera camera) {
						// TODO Do something with the preview image.
					}
				});
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		public void surfaceDestroyed(SurfaceHolder holder) {
			camera.stopPreview();
			camera = null;
		}

		public void surfaceChanged(SurfaceHolder holder, int format, int w,
				int h) {
			Camera.Parameters parameters = camera.getParameters();
			parameters.setPreviewSize(w, h);
			camera.setParameters(parameters);
			camera.startPreview();
		}
	}

	private int findFrontSideCamera() {
		int cameraId = -1;
		int numberOfCameras = Camera.getNumberOfCameras();
		for (int i = 0; i < numberOfCameras; i++) {
			CameraInfo cmInfo = new CameraInfo();
			Camera.getCameraInfo(i, cmInfo);
			if (cmInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
				cameraId = i;
				break;
			}
		}
		return cameraId;
	}
}

 

요요 (180 포인트) 님이 2014년 11월 4일 질문

1개의 답변

0 추천

저장 자체가 안되는 건가요? 아니면 사진이 제대로 안나오는 건가요? 

저장 자체가 안되었다면, logcat을 올려주세요..

코드상으로는 저장은 됐으나. 사진이 제대로 안나올 것으로 보입니다.

onPictureTaken 의 byte arrary에 들어오는 영상은 카메라에 따라 약간 다르겠지만 보통 YUV420sp 형식의 데이터입니다.

이걸 jpeg 형식 파일로 저장을 하시려면 변환 작업을 해주셔야하는데 변환 코드가 안보이네요..

 

변환 코드는 아래 URL의 예제를 참조 해 보세요..

http://stackoverflow.com/questions/1032258/android-how-to-save-a-preview-frame-as-jpeg-image

 

사악미소 (65,330 포인트) 님이 2014년 11월 5일 답변
답변 잘봤습니다.
링크달아주시는곳에 가서 소스코드 봤는데요 능력이 부족해서 봐도 잘 모르겠네요...
logcat을 올려드리고싶은데 실행하면 너무 빠르게 지나가서 어느부분을 찍어야할지 모르겠습니다ㅜㅜ

현재 상태는
사진촬영 버튼을 누르면 소리도 나오고 사진이 찍혀서 잠깐 멈추는 상태까지 되는데 정해놓은 경로에 가보면 사진도 없고 다른형태의 파일도 생기지 않아요
변환작업이 필요하다고 하셨는데 조금만 더 자세하게 부탁드릴게요ㅜㅜ
...