I am going to start a service to start audio recording. When I am trying to stop , it shows the following message
06-27 17:21:30.138: E/MediaRecorder(6122): stop called in an invalid state: 0
I am not sure whether other functions such Uploading data to server can affect the result ( not implemented in Asyck Task , only calling methods )
If I do not catch the runtime exception, sometimes it may shows the handler exception (Finishing Activity , stop recording )
06-27 17:32:35.988: W/System.err(6818): java.lang.IllegalStateException
06-27 17:32:35.988: W/System.err(6818): at android.media.MediaRecorder.stop(Native Method)
06-27 17:32:35.988: W/System.err(6818): at tvbpv.test.EOrderSystem1.RecordService.stopRecording(RecordService.java:109)
06-27 17:32:35.988: W/System.err(6818): at tvbpv.test.EOrderSystem1.RecordService.onDestroy(RecordService.java:46)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread.handleStopService(ActivityThread.java:2401)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread.access$2000(ActivityThread.java:127)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1225)
06-27 17:32:35.988: W/System.err(6818): at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 17:32:35.988: W/System.err(6818): at android.os.Looper.loop(Looper.java:137)
06-27 17:32:35.988: W/System.err(6818): at android.app.ActivityThread.main(ActivityThread.java:4519)
06-27 17:32:35.988: W/System.err(6818): at java.lang.reflect.Method.invokeNative(Native Method)
06-27 17:32:35.988: W/System.err(6818): at java.lang.reflect.Method.invoke(Method.java:511)
06-27 17:32:35.988: W/System.err(6818): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
06-27 17:32:35.988: W/System.err(6818): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
06-27 17:32:35.988: W/System.err(6818): at dalvik.system.NativeStart.main(Native Method)
Start recording
06-28 09:14:47.646: E/MediaRecorder(3089): start failed: -38
06-28 09:14:47.646: W/System.err(3089): java.lang.IllegalStateException
06-28 09:14:47.646: W/System.err(3089): at android.media.MediaRecorder.start(Native Method)
06-28 09:14:47.646: W/System.err(3089): at tvbpv.test.EOrderSystem1.RecordService.startRecording(RecordService.java:87)
06-28 09:14:47.646: W/System.err(3089): at tvbpv.test.EOrderSystem1.RecordService.onStart(RecordService.java:49)
06-28 09:14:47.646: W/System.err(3089): at android.app.Service.onStartCommand(Service.java:438)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2371)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread.access$1900(ActivityThread.java:127)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1222)
06-28 09:14:47.646: W/System.err(3089): at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 09:14:47.646: W/System.err(3089): at android.os.Looper.loop(Looper.java:137)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread.main(ActivityThread.java:4519)
06-28 09:14:47.646: W/System.err(3089): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 09:14:47.646: W/System.err(3089): at java.lang.reflect.Method.invoke(Method.java:511)
06-28 09:14:47.646: W/System.err(3089): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
06-28 09:14:47.646: W/System.err(3089): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
06-28 09:14:47.646: W/System.err(3089): at dalvik.system.NativeStart.main(Native Method)
The below is my code
RecordService.java
private MediaRecorder recorder;
private File instanceRecord;
private boolean recording= false;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onStart(Intent intent, int startId) {
startRecording();
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
stopRecording();
super.onDestroy();
}
private void prepareRecording()
{
try
{
recorder.prepare();
}
catch(IllegalStateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void startRecording(){
try {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
Date today = Calendar.getInstance().getTime();
Format formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String reportDate = formatter.format(today);
File instanceRecordDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "TVB_PV_recordings");
if(!instanceRecordDirectory.exists()){
instanceRecordDirectory.mkdirs();
}
instanceRecord = new File(instanceRecordDirectory.getAbsolutePath() + File.separator + reportDate + "_sales_recording.mp4");
if(!instanceRecord.exists()){
instanceRecord.createNewFile();
}
recorder.setOutputFile(instanceRecord.getAbsolutePath());
prepareRecording();
recorder.start();
recording = true;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
public void stopRecording() {
if (recorder != null) {
try {
recorder.stop();
} catch(RuntimeException e) {
instanceRecord.delete(); //you must delete the outputfile when the recorder stop failed.
} finally {
recorder.release();
recorder = null;
}
}
}
Other Activity:
stopService(new Intent(EOrderSystemSubmit.this, RecordService.class));
http://developer.android.com/reference/android/media/MediaRecorder.html - look the diagram at the beginnig of the topic very attantively. I am sure, you are calling stop when the recording wasn't started.
Stops recording. Call this after start(). Once recording is stopped, you will have to configure it again as if it has just been constructed. Note that a RuntimeException is intentionally thrown to the application, if no valid audio/video data has been received when stop() is called. This happens if stop() is called immediately after start(). The failure lets the application take action accordingly to clean up the output file (delete the output file, for instance), since the output file is not properly constructed when this happens.
Throws IllegalStateException if it is called before start()
This what the documentation says.