0

Эй, я пытаюсь заставить MediaRecorder записывать содержимое моего экрана. Он работает, когда я делаю запись в первый раз, но когда я пытаюсь записать экран во второй раз, он терпит неудачу. Вот соответствующий код:IllegalStateException при повторном использовании экземпляра MediaRecorder

void startRecording(String directory,String filename,MediaProjection mediaProjection) { 
    this.mediaProjection=mediaProjection; 
    this.directory=directory; 
    this.filename=filename; 
    initRecorder(); 
    prepareRecorder(); 
    virtualDisplay = createVirtualDisplay(); 
    mediaRecorder.start(); 
} 

void stopRecording() { 
    mediaRecorder.stop(); 
    mediaRecorder.reset(); 
    if (virtualDisplay != null) { 
     virtualDisplay.release(); 
    } 
    if (mediaProjection != null) { 
     mediaProjection.stop(); 
     mediaProjection = null; 
    } 
    initRecorder(); 
    prepareRecorder(); 

} 

void setScreen(int screenWidth, int screenHeight, int screenDensity) { 
    this.screenWidth = screenWidth; 
    this.screenHeight = screenHeight; 
    this.screenDensity = screenDensity; 
} 

void prepareRecorder() { 
    try { 
     mediaRecorder.prepare(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

void initRecorder() { 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    mediaRecorder.setVideoEncodingBitRate(512 * 1000); 
    mediaRecorder.setVideoFrameRate(30); 
    mediaRecorder.setVideoSize(screenWidth, screenHeight); 
    mediaRecorder.setOutputFile(directory + "/" + filename + ".mp4"); 
    //mediaRecorder.setOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath()+"/vitalij.mp4"); 
} 

Так что в моей деятельности я создаю новый экземпляр этого класса один раз, то после нажатия кнопки метод прибудут startRecording-х вызываются. Затем пользователь может нажать стоп-запись, которая вызывает метод stopRecording. Когда приложение уничтожено, я освобождаю объект mediaRecorder. Это ошибка, я получаю:

Caused by: java.lang.IllegalStateException 
     at android.media.MediaRecorder.setAudioSource(Native Method) 
     at com.example.xxx.myapplication.VideoRecorder.initRecorder(VideoRecorder.java:77) 
     at com.example.xxx.myapplication.VideoRecorder.startRecording(VideoRecorder.java:30) 
     at com.example.xxx.myapplication.MainActivity.onActivityResult(MainActivity.java:134) 

Я уверен, что у меня есть правильные разрешения, установленные и первое видео будут создаваться в порядке. Проблема возникает только при записи второй записи.

ответ

1

Вопрос заключается в том, что вы выполнение этих двух строк кода:

initRecorder(); 
prepareRecorder(); 

в конце вашей stopRecording() функции и снова в вашей startRecording() функции.

При попытке позвонить по номеру mediaRecorder.setAudioSource в initRecorder() после того, как источник звука уже установлен, вы получаете IllegalStateException, так как он находится в неправильном состоянии.

Если посмотреть на диаграмме состояний на the Android MediaRecorder reference page, вы увидите, что MediaRecorder должен находиться в исходном состоянии вызвать setAudioSource(), но у вас есть в приготовленном состоянии после stopRecording() была вызвана, и вы пытаетесь вызвать setAudioSource() снова ,

Смежные вопросы