MediaRecorder记录并生成文件但抛出异常

时间:2011-07-30 19:26:16

标签: android mediarecorder

我的MediaRecorder出现了奇怪的问题。它记录语音,制作带录音的文件。但是当我想使用stop()方法停止录制时,它会抛出IllegalStateException。通常我使用了setMaxDuration()方法,所以通常我使用OnInfoListener进行结束录制并且它正常工作。但我还想在ImageView的OnTouchListener中停止MediaRecorder。我的代码在这里:

private static String OUTPUT_FILE;

private void prepareRecording() throws Exception {      
    OUTPUT_FILE = "/sdcard/temp.3gpp";      
    File outFile = new File(OUTPUT_FILE);

    if (outFile.exists())
        outFile.delete();       

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(OUTPUT_FILE);
    recorder.setMaxDuration(10000);
    try {
        recorder.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }       
    recorder.start();       
}

private void startRecording() {  
     ImageView image = (ImageView) this.findViewById(R.id.image);

     image.post(new Runnable() { 
     @Override
     public void run() {
        try {
                prepareRecording();
            } catch (Exception e) {
                e.printStackTrace();                    
            }   

        image.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                if (recorder != null)
                    recorder.stop();
                return true;
            }
        });

        recorder.setOnInfoListener(new OnInfoListener() {

            @Override
            public void onInfo(MediaRecorder mr, int what, int extra) {                     
                if (recorder != null && what == 800){
                    recorder.stop();                            
                }                       
            }
        });     

    }});
    }

当我触摸ImageView时,我在代码为recorder.stop()的行上有FATAL EXCEPTION java.lang.IllegalStateException。我测试了我的代码,我意识到MediaRecorder似乎没有启动。因此我在recorder.stop()中有IllegalStateException。但是当录音停止时,我可以在我的SD卡录音文件上找到。我的代码怎么了?

我还将AnimationDrawable连接到我的图像。它运作正常。

1 个答案:

答案 0 :(得分:1)

我已经解决了我的问题。有必要在onTouch方法中启动新线程以避免eceptions。

image.setOnTouchListener(new OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        Thread thread = new Thread(){
        public void run(){                              
                if (recorder != null)                                   
                    recorder.stop();
        }
    };
    thread.start();                             
    return false;
    }
});