Android stop recording fail

17,742

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.

Share:
17,742

Related videos on Youtube

Larry Lo
Author by

Larry Lo

Code with passion.

Updated on September 15, 2022

Comments

  • Larry Lo
    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
    Larry Lo almost 11 years
    So 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.