Я использую MediaRecorder.pause и MediaRecorder.resume для приостановки и возобновления записи на экране. Пауза работает нормально, но когда я вызываю MediaRecorder.resume (), произойдет ошибка, обнаруженная моим ErrorListener, и содержание ошибки будет:
what: 536871012, extra: -1007
, и как только эта ошибка будетпоймал, когда я выполняю MediaRecorder.stop () в следующем, появляется остановка не удалось:
java.lang.RuntimeException: остановка не удалась.
в android.media.MediaRecorder.stop (NativeМетод)
... (стек ошибок)
, а также записанное видео не удалось открыть правильно.
Ниже приведены некоторые фрагменты моего кода:
MediaHelper.java:
public void pauseMediaRecorder() {
// Android officially support this function after Nougat
if (mMediaRecorder != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
mMediaRecorder.pause();
}
public void resumeMediaRecorder() {
// Android officially support this function after Nougat
if (mMediaRecorder != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mMediaRecorder.resume();// This line would trigger errors caught by ErrorListener
}
}
public void stopScreenRecorder(Context context) {
try{
if (mMediaRecorder != null) {
mMediaRecorder.setOnErrorListener(null);
mMediaRecorder.setOnInfoListener(null);
mMediaRecorder.setPreviewDisplay(null);
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder = null;
}
} catch(IllegalStateException illegalStateException) {
illegalStateException.printStackTrace();
} catch (RuntimeException runtimeException) {
try{
StringWriter errors = new StringWriter();
runtimeException.printStackTrace(new PrintWriter(errors));
StringBuilder report = new StringBuilder("Log:\n" + errors.toString() + "\n");
String fileName = "RuntimeException";
File file = new File(context.getExternalFilesDir("RuntimeException"), fileName);
FileOutputStream trace = new FileOutputStream(file);
trace.write(report.toString().getBytes());
trace.close();
} catch (IOException iOException){
iOException.printStackTrace();
}
}
... (other things like stop MediaProjection and release VirtualDisplay)
}
FloatingView.java
CheckBox pauseButton = findViewById(R.id.recording_pause);
pauseButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
isPause = false;
MediaHelper.getInstance().resumeMediaRecorder();
if(!isPause){
executorService = Executors.newFixedThreadPool(2);
executorService.execute(runnable);
}
} else {
MediaHelper.getInstance().pauseMediaRecorder();
isPause = true;
executorService.shutdownNow();
}
recordTime();// For showing the recorded time info on the view.
blink();// A red blinking dot makes users knowing it's recording.
});
Более того, ничего плохого не произойдет, если я остановлю запись сразу после выполнения MediaRecorder.pause ().
Я прочитал официальный сайт Android (https://developer.android.com/reference/android/media/MediaRecorder.html),, но информации о возобновлении или паузе не так много, даже эти два состояния не показаны на диаграмме состояний.
И эта ошибка возобновления не отображается при каждом тестировании devices, пока отображается только на одном устройстве.
Кто-нибудь имеет какое-либо представление об этом?
Заранее признателен!