안드로이드 개발 질문/답변
(글 수 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; } } }