2016-01-19 9 views
1

Я работаю с android.media.MediaRecorder для записи голосового вызова, и застрял на исключение java.lang.IllegalStateException, пожалуйста, помогитеCall Recording неудачу с java.lang.IllegalStateException

Код

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d(SERVICE_TAG,"onStartCommand [flags: " + flags + ", startId: " + startId + "]"); 

     initMediaRecorder("onStartCommand"); 

     if(PojoClass.isRecording){ 
      return super.onStartCommand(intent, flags, startId); 
     }else{ 
      try { 
       //create Sound File. 
       Recording = createOutputFile(); 
       //work for recording 
       if(Recording != null){ 
        iRecorder.reset(); 
        //iRecorder.setAudioChannels(1); //1 -> mono and 2-> Stereo 
        iRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
        iRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //Line #82 
        iRecorder.setOutputFile(Recording.getAbsolutePath()); 
        Log.d(MEDIA_RECORDER_TAG,"Recorder Set\nAudioChannels: 1 (mono)" + 
          "\nAudioSource: " + MediaRecorder.AudioSource.DEFAULT + 
          "\nAudioEncoder: " + MediaRecorder.AudioEncoder.DEFAULT + 
          "\nOutputFile: " + Recording.getAbsolutePath()); 

        iRecorder.setOnErrorListener(this); 
        iRecorder.setOnInfoListener(this); 
        try { 
         iRecorder.prepare(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
         iRecorder.release(); 
         iRecorder = null; 
        } 

        //start recording 
        iRecorder.start(); 
        PojoClass.isRecording = true; 
        //Notify user that Call is being recorded. 
        NotifyUserOnRecording(true); 
       } 
      } catch(Exception e){ 
       e.printStackTrace(); 
       iRecorder.release(); 
       iRecorder = null; 
      } 
     } 
     return super.onStartCommand(intent, flags, startId); 
    } 

LogCat

01-19 14:44:43.949 2191-2191/com.example.myapplication D/iRecordCall﹕ onCreate 
01-19 14:44:43.949 2191-2191/com.example.myapplication D/MEDIA_RECORDER_TAG﹕ MediaRecorder is initialize at [onCreate] 
01-19 14:44:43.951 2191-2191/com.example.myapplication D/iRecordCall﹕ onStartCommand [flags: 0, startId: 1] 
01-19 14:44:43.951 2191-2191/com.example.myapplication D/MEDIA_RECORDER_TAG﹕ MediaRecorder is initialize at [onStartCommand] 
01-19 14:44:43.961 2191-2191/com.example.myapplication E/MediaRecorder﹕ setAudioEncoder called in an invalid state(2) 
01-19 14:44:43.961 2191-2191/com.example.myapplication W/System.err﹕ java.lang.IllegalStateException 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at android.media.MediaRecorder.setAudioEncoder(Native Method) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at com.example.myapplication.recorderservice.iRecordCall.onStartCommand(iRecordCall.java:82) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3010) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at android.app.ActivityThread.-wrap17(ActivityThread.java) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at android.os.Looper.loop(Looper.java:148) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5417) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
01-19 14:44:43.963 2191-2191/com.example.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

ответ

1

MediaRecorder имеет чтобы быть в состоянии «DataSourceConfigured», если вы хотите позвонить

iRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

Так что перед этой линией вам необходимо установить формат файла, который вы хотите произвести, например:

iRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

См. Также эту ссылку на documentation, особенно диаграмму состояния.

+0

@ 0x0nosugure Спасибо, это сработало для меня, но также показало одно и то же исключение на 'iRecorder.start()' как ** MediaRecorder: start failed: -38 ** – iSandeep

+0

@iSandeep - вы разместили «iRecorder.prepare()», в блоке try-catch. Можете ли вы определить, было ли это успешным? – 0X0nosugar

+0

@ 0x0nosugure Да, это Успешно – iSandeep