안녕하세요.

미리보기를 하면서 녹화하는 프로그램을 짜보는데,
녹화를 시작하면 매번 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)



소스 코드
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;
        }
    }
}