Воспроизведение с того места, где пользователь остановился на 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 ответ

Этого можно добиться двумя способами:

  1. Подождите seek завершить перед звонком play. Или,
  2. Предварительно загрузите звук в определенном месте, используя initialPosition параметр just_audio setAudioSource.

Я бы попытался обработать восстановление сохраненной позиции плеера прозрачно, внутри вашего обработчика звука. Таким образом, клиенту вашего обработчика звука не нужно будет знать, как это обрабатывается, и он просто вызовет audioHandler.play() когда он хочет воспроизвести, и обработчик звука будет внутренне знать, с какой позиции начать воспроизведение.

Вы можете добиться этого, восстановив состояние проигрывателя из конструктора обработчика звука. Так, например, код инициализации вашего обработчика звука может включать:

      player = AudioPlayer();
await player.setAudioSource(source,
    initialPosition: savedPosition);

Вы получаете IllegalSeekPositionExceptionпотому что библиотека ExoPlayer на Android считает, что вы ищете позицию, которая не находится в пределах временной шкалы этого файла. Вы можете проверить значение позиции поиска по сравнению с продолжительностью и убедиться, что она меньше.

Другие вопросы по тегам