안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
미리보기를 하면서 녹화하는 프로그램을 짜보는데,
녹화를 시작하면 매번 IllegalStateException이 발생하면서 프로그램이 종료되네요.
MediaRecorder에 인코딩 등 속성을 설정할 때 순서대로 안하면 나는 오류라는데, API 참고해서 순서대로 배치해도 계속 같은 에러가 납니다.
혹 이유를 아는 분 계시면 도와주세요.
오류 로그와 코드 올립니다.
로그캣 에러 로그 (경고 1개, 에러 1개)
소스 코드
미리보기를 하면서 녹화하는 프로그램을 짜보는데,
녹화를 시작하면 매번 IllegalStateException이 발생하면서 프로그램이 종료되네요.
MediaRecorder에 인코딩 등 속성을 설정할 때 순서대로 안하면 나는 오류라는데, API 참고해서 순서대로 배치해도 계속 같은 에러가 납니다.
혹 이유를 아는 분 계시면 도와주세요.
오류 로그와 코드 올립니다.
로그캣 에러 로그 (경고 1개, 에러 1개)
07-23 05:02:47.888: ERROR/MediaRecorder(555): prepare failed: -1
07-23 05:02:47.898: WARN/System.err(555): java.io.IOException: prepare failed.
07-23 05:02:47.908: WARN/System.err(555): at android.media.MediaRecorder._prepare(Native Method)
07-23 05:02:47.918: WARN/System.err(555): at android.media.MediaRecorder.prepare(MediaRecorder.java:467)
07-23 05:02:47.927: WARN/System.err(555): at kr.pe.spinell.ntest00.Recorder.surfaceCreated(Recorder.java:76)
07-23 05:02:47.937: WARN/System.err(555): at android.view.SurfaceView.updateWindow(SurfaceView.java:454)
07-23 05:02:47.957: WARN/System.err(555): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:287)
07-23 05:02:47.957: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.957: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.968: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.978: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.978: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.988: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.988: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.998: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.998: WARN/System.err(555): at android.view.View.draw(View.java:6538)
07-23 05:02:48.008: WARN/System.err(555): at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-23 05:02:48.030: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-23 05:02:48.038: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:48.038: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:48.038: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:48.058: WARN/System.err(555): at android.view.View.draw(View.java:6538)
07-23 05:02:48.058: WARN/System.err(555): at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-23 05:02:48.058: WARN/System.err(555): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830)
07-23 05:02:48.058: WARN/System.err(555): at android.view.ViewRoot.draw(ViewRoot.java:1349)
07-23 05:02:48.058: WARN/System.err(555): at android.view.ViewRoot.performTraversals(ViewRoot.java:1114)
07-23 05:02:48.058: WARN/System.err(555): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
07-23 05:02:48.058: WARN/System.err(555): at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 05:02:48.068: WARN/System.err(555): at android.os.Looper.loop(Looper.java:123)
07-23 05:02:48.088: WARN/System.err(555): at android.app.ActivityThread.main(ActivityThread.java:4363)
07-23 05:02:48.097: WARN/System.err(555): at java.lang.reflect.Method.invokeNative(Native Method)
07-23 05:02:48.097: WARN/System.err(555): at java.lang.reflect.Method.invoke(Method.java:521)
07-23 05:02:48.097: WARN/System.err(555): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-23 05:02:48.107: WARN/System.err(555): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-23 05:02:48.107: WARN/System.err(555): at dalvik.system.NativeStart.main(Native Method)
07-23 05:02:50.147: ERROR/AndroidRuntime(555): Uncaught handler: thread Thread-10 exiting due to uncaught exception
07-23 05:02:50.167: ERROR/AndroidRuntime(555): java.lang.IllegalStateException
07-23 05:02:50.167: ERROR/AndroidRuntime(555): at android.media.MediaRecorder.start(Native Method)
07-23 05:02:50.167: ERROR/AndroidRuntime(555): at kr.pe.spinell.ntest00.Recorder.startRecording(Recorder.java:121)
07-23 05:02:50.167: ERROR/AndroidRuntime(555): at kr.pe.spinell.ntest00.Main$RecorderController.run(Main.java:88)
07-23 05:02:47.898: WARN/System.err(555): java.io.IOException: prepare failed.
07-23 05:02:47.908: WARN/System.err(555): at android.media.MediaRecorder._prepare(Native Method)
07-23 05:02:47.918: WARN/System.err(555): at android.media.MediaRecorder.prepare(MediaRecorder.java:467)
07-23 05:02:47.927: WARN/System.err(555): at kr.pe.spinell.ntest00.Recorder.surfaceCreated(Recorder.java:76)
07-23 05:02:47.937: WARN/System.err(555): at android.view.SurfaceView.updateWindow(SurfaceView.java:454)
07-23 05:02:47.957: WARN/System.err(555): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:287)
07-23 05:02:47.957: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.957: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.968: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.978: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.978: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.988: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.988: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:47.998: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:47.998: WARN/System.err(555): at android.view.View.draw(View.java:6538)
07-23 05:02:48.008: WARN/System.err(555): at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-23 05:02:48.030: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-23 05:02:48.038: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:48.038: WARN/System.err(555): at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-23 05:02:48.038: WARN/System.err(555): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-23 05:02:48.058: WARN/System.err(555): at android.view.View.draw(View.java:6538)
07-23 05:02:48.058: WARN/System.err(555): at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-23 05:02:48.058: WARN/System.err(555): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830)
07-23 05:02:48.058: WARN/System.err(555): at android.view.ViewRoot.draw(ViewRoot.java:1349)
07-23 05:02:48.058: WARN/System.err(555): at android.view.ViewRoot.performTraversals(ViewRoot.java:1114)
07-23 05:02:48.058: WARN/System.err(555): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
07-23 05:02:48.058: WARN/System.err(555): at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 05:02:48.068: WARN/System.err(555): at android.os.Looper.loop(Looper.java:123)
07-23 05:02:48.088: WARN/System.err(555): at android.app.ActivityThread.main(ActivityThread.java:4363)
07-23 05:02:48.097: WARN/System.err(555): at java.lang.reflect.Method.invokeNative(Native Method)
07-23 05:02:48.097: WARN/System.err(555): at java.lang.reflect.Method.invoke(Method.java:521)
07-23 05:02:48.097: WARN/System.err(555): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-23 05:02:48.107: WARN/System.err(555): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-23 05:02:48.107: WARN/System.err(555): at dalvik.system.NativeStart.main(Native Method)
07-23 05:02:50.147: ERROR/AndroidRuntime(555): Uncaught handler: thread Thread-10 exiting due to uncaught exception
07-23 05:02:50.167: ERROR/AndroidRuntime(555): java.lang.IllegalStateException
07-23 05:02:50.167: ERROR/AndroidRuntime(555): at android.media.MediaRecorder.start(Native Method)
07-23 05:02:50.167: ERROR/AndroidRuntime(555): at kr.pe.spinell.ntest00.Recorder.startRecording(Recorder.java:121)
07-23 05:02:50.167: ERROR/AndroidRuntime(555): at kr.pe.spinell.ntest00.Main$RecorderController.run(Main.java:88)
소스 코드
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaRecorder;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class Recorder extends SurfaceView implements SurfaceHolder.Callback {
MediaRecorder mediaRecorder = null; // 레코더
SurfaceHolder surfaceHolder = null; // 미리보기
Camera camera = null; // 카메라
String strRecPath = null; // 저장위치
String strRecFile = null; // 파일명
boolean bRecCheck = false; // 녹화여부 확인
// 생성자
// MediaRecorder 데이터 할당은 순서대로 해야 함
public Recorder(Context context) {
super(context);
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mediaRecorder = new MediaRecorder();
camera = Camera.open(); // 카메라 객체 할당
mediaRecorder.setCamera(camera); // 레코더의 녹화용 카메라 설정
// 미디어 레코더 소스 설정(마이크, 카메라)
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 포맷 설정
strRecPath = "/sdcard/"; // 저장위치 설정
strRecFile = "test.3gp"; // 파일이름 설정
strRecFile = strRecPath + "/" + strRecFile;
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediaRecorder.setOutputFile(strRecFile);
// 미디어 레코더 인코딩 설정(기본)
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
// 비디오 옵션 설정
mediaRecorder.setVideoFrameRate(15);
mediaRecorder.setVideoSize(320, 240);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
if(mediaRecorder != null) {
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Parameters parameters = camera.getParameters();
// Size size = parameters.getSupportedPreviewSizes().get(0);
// parameters.setPreviewSize(size.height, size.width);
parameters.setPreviewSize(160, 120);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
public MediaRecorder getRecorder() {
return mediaRecorder;
}
public void setRecorder(MediaRecorder mediaRecorder) {
this.mediaRecorder = mediaRecorder;
}
// 녹화 시작
public void startRecording() {
mediaRecorder.start();
bRecCheck = true;
}
// 녹화 종료
public void stopRecording() {
if(bRecCheck == true) {
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
bRecCheck = false;
}
}
}


