Android stop recording fail
Solution 1
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.
Solution 2
The error is thrown when recorder is not initialized. Try to start record after data source initialization completion. For example, If you are trying to record a call, start the recording when OFFHOOK uccors.
Related videos on Youtube
Comments
-
Larry Lo over 1 year
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));
-
Larry Lo almost 11 yearsSo do you mean that I have to refer the Exception and resolve the issue at the Activity which call the service ? I have put this to other Applications and call this background servie only, it works.