MediaRecorder crashes on start

后端 未结 8 1732
没有蜡笔的小新
没有蜡笔的小新 2020-12-06 12:25

i\'ve searched many topics but no straight answer.

I have this code :

        recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecord         


        
相关标签:
8条回答
  • 2020-12-06 12:29

    Must first call setOutputFile() , and then call other methods.

    and you must create file before all.

    0 讨论(0)
  • 2020-12-06 12:30

    i am using the following code,works perfectly for me..

    protected void startRecording() {
        // TODO Auto-generated method stub
        i++;
         mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
         mFileName += "/audiorecordtest"+i+".3gp";
        recorder = new MediaRecorder();
    
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setOutputFile(mFileName);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    
          try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            Toast.makeText(getApplicationContext(), "IllegalStateException called", Toast.LENGTH_LONG).show();
    
    
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Toast.makeText(getApplicationContext(), "prepare() failed", Toast.LENGTH_LONG).show();
    
        }
    
          recorder.start();
    }
    
     private void stopRecording() {
         recorder.stop();
         recorder.release();
         recorder = null;
        }
    
    0 讨论(0)
  • 2020-12-06 12:34

    Ok, I got it. I guess you initialized mStartRecording to true.

    Thus your if is going into the else block. In it, you stop a brand new instance of MediaRecorder and the state diagram doesn't allow that.

    Make your media recorder a field of your class. And initialize properly your mStartRecording boolean variable to false. Re instanciate your media recorder only if your field is null.

    if( recorder == null ) {
       recorder = new MediaRecorder();
       recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
       recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    
       recorder.setOutputFile(mFileName);
       recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    }//if
    if(!mStartRecording) {
        btn.setText("Stop Recording");
        try {
            recorder.prepare();
            recorder.start();
            mStartRecording = true;
        }  catch (IOException e) {
            e.printStackTrace();
        }//catch
    } else {
        btn.setText("Start Recording");
        mStartRecording = false;
        recorder.stop();
        recorder.reset();
        recorder.release();
        recorder = null;
    }//else
    
    0 讨论(0)
  • 2020-12-06 12:42

    I had the same problem. This is because I had missed a slash while setting the filename for the recorded audio.

    change

    this.fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    this.fileName += "yourfilename.3gp";
    

    to

    this.fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    this.fileName += "/yourfilename.3gp";
    
    0 讨论(0)
  • 2020-12-06 12:46

    These methods must arrange the order it will run. Here:

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFile(mFileName);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    
    0 讨论(0)
  • 2020-12-06 12:47

    I had same problem because of my SurfaceView has been made invisible. So make it Visible

      mSurfaceView.setVisibility(View.VISIBLE);
    
    0 讨论(0)
提交回复
热议问题