Это исключение IOException начало происходить в моем приложении Android после обновления до AndroidX и увеличения целевого SDK до версии 28.
До этого тот же код работал нормально.
Это представляет собой приложение Capacitor и использует плагин Capacitor-Video-Recorder . Под капотом этот плагин использует библиотеку fancycamera java, которая взаимодействует с android.media.MediaRecorder
.
Вот трассировка стека, которая выдается при вызове VideoRecorder.startRecording
, что в конечном итоге приводит к вызов MediaRecorder.prepare:
I/IMediaRecorder: prepare (BpMediaRecorder client) in file frameworks/av/media/libmedia/IMediaRecorder.cpp, function prepare, line 253
E/MediaRecorder: prepare failed: -2147483648
W/System.err: java.io.IOException: prepare failed.
W/System.err: at android.media.MediaRecorder._prepare(Native Method)
W/System.err: at android.media.MediaRecorder.prepare(MediaRecorder.java:1038)
W/System.err: at co.fitcom.fancycamera.Camera2.setUpMediaRecorder(Camera2.java:607)
W/System.err: at co.fitcom.fancycamera.Camera2.startRecording(Camera2.java:837)
W/System.err: at co.fitcom.fancycamera.FancyCamera.startRecording(FancyCamera.java:323)
W/System.err: at com.github.sbannigan.capacitor.VideoRecorder.startRecording(VideoRecorder.java:267)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.getcapacitor.PluginHandle.invoke(PluginHandle.java:99)
W/System.err: at com.getcapacitor.Bridge$1.run(Bridge.java:515)
W/System.err: at android.os.Handler.handleCallback(Handler.java:907)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:105)
W/System.err: at android.os.Looper.loop(Looper.java:216)
W/System.err: at android.os.HandlerThread.run(HandlerThread.java:65)
Приложение Android запрашивает разрешения CAMERA и RECORD_AUDIO, и я могу подтвердить, что пользователю сначала предлагается ввести их.
AndroidManifest. xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
Я также вижу, что выходной файл создается в каталоге данных приложения. Однако файл остается пустым. Я также попытался вручную записать в тот же файл, и это возможно, поэтому файловый ввод-вывод не является проблемой.
Cra sh исходит из собственного метода, поэтому отладчик не работает т очень полезно. Однако я могу, по крайней мере, подтвердить, что переменная MediaRecorder mPath
, похоже, правильно установлена непосредственно перед вызовом _prepare
.
Я создал пример приложения с идентичным стеком, где можно воссоздать ошибку : https://github.com/disbelief/video-recorder-test
Мне также было бы интересно узнать, какие еще возможные причины могут быть для MediaRecorder.prepare
, чтобы вызвать это исключение.