안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요~
카메라를 통해서 간단히 테스트를 해봤는데요;
제가 아직 초보인지라 거창하게는 아니고, 프리뷰를 통해서 화면에 나오게 하고,
그리고 찍는것까지 할려고 소스를 짜보았습니다.
그런데 에뮬에서는 돌아가는데, 핸드폰으로 넣어서 실행시키면
에러를 발생하면서 앱이 그냥 죽어버리네요 ㅠ
아래는 소스코드 입니다.
1. 액티비티를 받는 CameraEx
2. 클래스 CameraView
3. main.xml
다음과 같이 세가지로 구성이 되어있습니다~
androidmanifest.xml 에는 카메라 퍼미션도 주었구요~~
그런데 에뮬로는 구동이 되는데 실제 폰으로만 넣으면 안되서 ㅠ 예상치 못한 에러로 종료합니다라는
구문이 자꾸 나와서요 ㅠ
고수분들께서 좀 도와주세요 ㅠ
카메라를 통해서 간단히 테스트를 해봤는데요;
제가 아직 초보인지라 거창하게는 아니고, 프리뷰를 통해서 화면에 나오게 하고,
그리고 찍는것까지 할려고 소스를 짜보았습니다.
그런데 에뮬에서는 돌아가는데, 핸드폰으로 넣어서 실행시키면
에러를 발생하면서 앱이 그냥 죽어버리네요 ㅠ
아래는 소스코드 입니다.
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 에는 카메라 퍼미션도 주었구요~~
그런데 에뮬로는 구동이 되는데 실제 폰으로만 넣으면 안되서 ㅠ 예상치 못한 에러로 종료합니다라는
구문이 자꾸 나와서요 ㅠ
고수분들께서 좀 도와주세요 ㅠ



