i\'ve searched many topics but no straight answer.
I have this code :
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecord
Must first call setOutputFile()
, and then call other methods.
and you must create file before all.
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;
}
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
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";
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);
I had same problem because of my SurfaceView has been made invisible. So make it Visible
mSurfaceView.setVisibility(View.VISIBLE);