Воспроизведение с того места, где пользователь остановился на mediaItem, с использованием just_audio и audio_service
Я работаю над приложением для подкастов, и одна из особенностей приложения заключается в том, что оно сохраняет позицию, в которой пользователь покидает подкаст, чтобы воспроизвести другой, или полностью покидает приложение. Я не мог найти способ воспроизвести сохраненный подкаст с его
lastPlayed
отметка времени без предварительного воспроизведения указанного подкаста с использованием
audioHandler.play()
и переход к позиции, на которой пользователь остановился, используя
audioHandler.seek(lastPlayed)
. Используя этот метод воспроизведения, я получаю эту ошибку: и подкаст воспроизводится с самого начала, а не с того места, где он должен. Какие-либо предложения?
W / System.err(27454): com.google.android.exoplayer2.IllegalSeekPositionExceptionW / System.err (27454): в com.google.android.exoplayer2.ExoPlayerImpl.seekTo (ExoPlayerImpl.java:611) W / System. err (27454): в com.google.android.exoplayer2.SimpleExoPlayer.seekTo (SimpleExoPlayer.java:1527) W / System.err (27454): в com.ryanheise.just_audio.AudioPlayer.seek (AudioPlayer.java:953) W / System.err (27454): в com.ryanheise.just_audio.AudioPlayer.onMethodCall (AudioPlayer.java:455) W / System.err (27454): в io.flutter.plugin.common.MethodChannel $ IncomingMethodCallHandageMethodChannel.java:233)W / System.err (27454): в io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart (DartMessenger.java:85) W / System.err (27454): в io.flutter. embedding.engine.FlutterJNI.handlePlatformMessage (FlutterJNI.java:818) W / System.err (27454): в android.os.MessageQueue.nativePollOnce (собственный метод) W / System.err (27454): в android.os.MessageQueue.next(MessageQueue.java:335)W / System.err (27454): в android.os.Looper.loop (Looper.java : 206)W / System.err (27454): в android.app.ActivityThread.main (ActivityThread.java:8512) W / System.err (27454): в java.lang.reflect.Method.invoke (собственный метод) W / System.err (27454): в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:602)W / System.err (27454): в com.android.internal.os.ZygoteInit. main (ZygoteInit.java:1130)E / flutter (27454): [ОШИБКА: flutter / lib / ui / ui_dart_state.cc(199)] Необработанное исключение: PlatformException (недопустимое состояние: null, null, null, null)app.ActivityThread.main (ActivityThread.java:8512) W / System.err (27454): в java.lang.reflect.Method.invoke (собственный метод) W / System.err (27454): в com.android.internal .os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:602)W / System.err (27454): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)E / flutter (27454): [ОШИБКА: flutter / lib / ui / ui_dart_state.cc(199)] Необработанное исключение: PlatformException (недопустимое состояние: null, null, null, null)app.ActivityThread.main (ActivityThread.java:8512) W / System.err (27454): в java.lang.reflect.Method.invoke (собственный метод) W / System.err (27454): в com.android.internal .os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:602)W / System.err (27454): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)E / flutter (27454): [ОШИБКА: flutter / lib / ui / ui_dart_state.cc(199)] Необработанное исключение: PlatformException (недопустимое состояние: null, null, null, null)PlatformException (недопустимое состояние: null, null, null, null)PlatformException (недопустимое состояние: null, null, null, null)
1 ответ
Этого можно добиться двумя способами:
- Подождите
seek
завершить перед звонкомplay
. Или, - Предварительно загрузите звук в определенном месте, используя
initialPosition
параметр just_audiosetAudioSource
.
Я бы попытался обработать восстановление сохраненной позиции плеера прозрачно, внутри вашего обработчика звука. Таким образом, клиенту вашего обработчика звука не нужно будет знать, как это обрабатывается, и он просто вызовет
audioHandler.play()
когда он хочет воспроизвести, и обработчик звука будет внутренне знать, с какой позиции начать воспроизведение.
Вы можете добиться этого, восстановив состояние проигрывателя из конструктора обработчика звука. Так, например, код инициализации вашего обработчика звука может включать:
player = AudioPlayer();
await player.setAudioSource(source,
initialPosition: savedPosition);
Вы получаете
IllegalSeekPositionException
потому что библиотека ExoPlayer на Android считает, что вы ищете позицию, которая не находится в пределах временной шкалы этого файла. Вы можете проверить значение позиции поиска по сравнению с продолжительностью и убедиться, что она меньше.