Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IllegalStateException [start called in an invalid state: 1] on restarting Android MediaRecorder

I am trying to implement simple logic to start/stop recording with MediaRecorder of Android.

The cycle is

  1. connect to localSocket / set options / mRecorder.prepare();
  2. mRecorder.start();
  3. mRecorder.stop(); mRecorder.reset();

Then, loop between 2 and 3.

In the first cycle, 1,2,3 works fine as intended, however, I've got an error on the second start(restart) after the first stop.

com.example.app E/MediaRecorder﹕ start called in an invalid state: 1

What is the MediaRecorder state 1? What do I miss? Thanks for your input.

if (cmd.equals("connect"))
{
    try
    {
        sender.connect(new LocalSocketAddress(SOCKET_ADDRESS)); 
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mRecorder.setOutputFile(sender.getFileDescriptor()); 
        mRecorder.prepare(); 
    }
    catch (IOException e)
    {   e.printStackTrace();  } 
} 
if (cmd.equals("start"))
{
    try
    { 
        mRecorder.start(); 
    }
    catch (IllegalStateException e)
    { e.printStackTrace();  } 
} 
if (cmd.equals("stop"))
{ 
    try
    {
        mRecorder.stop();
        mRecorder.reset(); 
    }
    catch (Exception e)
    { e.printStackTrace(); }
}

1 Answers

I'd had the same problem. I had to make a function initRecorder that sets up and prepares the media recorder. Then I called this function each time after the start button was pressed but before start was called. recreate() after stop also works.

    StartRecording.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 100);

            try {
                try {
                    initRecorder(mHolder.getSurface());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mMediaRecorder.start();

                Log.e("mRecorder", "Started");
            } catch (RuntimeException e) {
                Log.e("mRecorder", "Start Failure");
                e.printStackTrace();

            }
        }
    });


private void initRecorder(Surface surface) throws IOException {

    toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 1000);

    if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder();

   // mMediaRecorder.setCamera(mCamera);

    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    //       mMediaRecorder.setOutputFormat(8);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    //mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
    mMediaRecorder.setVideoFrameRate(30);
   // mMediaRecorder.setVideoSize(640,480);

    mMediaRecorder.setPreviewDisplay(surface);
    mMediaRecorder.setOutputFile(path);

  // mMediaRecorder.setPreviewDisplay(mHolder.getSurface());
    mMediaRecorder.setMaxDuration(10000); // 10 seconds
    try {
        mMediaRecorder.prepare();
        Log.e("mRecorder", "Prepared");
    } catch (IOException e) {
       Log.e("mRecorder", "Prepare Failure");
        e.printStackTrace();
    }

    mInitSuccesful = true;

}
like image 196
Frank Znidarsic Avatar answered Nov 24 '25 15:11

Frank Znidarsic



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!