안녕하세요~

카메라를 통해서 간단히 테스트를 해봤는데요;

제가 아직 초보인지라 거창하게는 아니고, 프리뷰를 통해서 화면에 나오게 하고,

그리고 찍는것까지 할려고 소스를 짜보았습니다.

그런데 에뮬에서는 돌아가는데, 핸드폰으로 넣어서 실행시키면

에러를 발생하면서 앱이 그냥 죽어버리네요 ㅠ

아래는 소스코드 입니다.


1. 액티비티를 받는 CameraEx
package net.npaka.cameraex;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
//카메라 제어
public class CameraEx extends Activity {
 //어플리케이션 초기화
 @Override
  public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(new CameraView(this));
 }
}


2. 클래스 CameraView

package net.npaka.cameraex;
import android.content.Context;
import android.hardware.Camera;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.FileOutputStream;
// 카메라의 제어
public class CameraView extends SurfaceView
implements SurfaceHolder.Callback,Camera.PictureCallback {
 private SurfaceHolder holder; // 홀더
 private Camera camera; // 카메라
 
 // 생성자
 public CameraView(Context context) {
  super(context);
  
  // 표면 홀더 생성
  holder=getHolder();
  holder.addCallback(this);
  // 푸쉬 버퍼 지정 (1)
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 
 // 표면 생성 이벤트의 처리
 public void surfaceCreated(SurfaceHolder holder) {
  // 카메라 초기화 (2)
  try {
   camera=Camera.open();
   camera.setPreviewDisplay(holder);
  } catch (Exception e) {
  }
 }
 
 // 표면 변경 이벤트 처리
 public void surfaceChanged(SurfaceHolder holder,int format,int w,int h) {
  // 카메라 미리보기 시작 (3)
  camera.startPreview();
 }
 
 // 표면 파괴 이벤트 처리
 public void surfaceDestroyed(SurfaceHolder holder) {
  // 카메라 미리보기 정지 (4)
  camera.setPreviewCallback(null);
  camera.stopPreview();
  camera.release();
  camera=null;
 }
 
 // 터치 이벤트 처리
 @Override
  public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() ==MotionEvent.ACTION_DOWN) {
   // 카메라 스크린 샷 구하기 (5)
   camera.takePicture(null,null,this);
  }
  return true;
 }
 
 // 사진 촬영 완료 시 불린다.
 public void onPictureTaken(byte[] data,Camera camera) {
  // 파일 보존과 갤러리로의 등록
  try {
   data2sd(getContext(),data,"test.jpg");
  } catch (Exception e) {
   android.util.Log.e("",""+e.toString());
  }
  
  // 미리보기 재개
  camera.startPreview();
 }
 
 // 바이트 데이터→SD 카드
 private static void data2sd(Context context,
  byte[] w,String fileName) throws Exception {
  // SD 카드에 데이터 저장 (6)
  FileOutputStream fos=null;
  try {
   fos=new FileOutputStream("/sdcard/"+fileName);
   fos.write(w);
   fos.close();
  } catch (Exception e) {
   if (fos!=null) fos.close();
   throw e;
  }
 }
}


3. main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

다음과 같이 세가지로 구성이 되어있습니다~

androidmanifest.xml 에는 카메라 퍼미션도 주었구요~~

그런데 에뮬로는 구동이 되는데 실제 폰으로만 넣으면 안되서 ㅠ 예상치 못한 에러로 종료합니다라는

구문이 자꾸 나와서요 ㅠ

고수분들께서 좀 도와주세요 ㅠ