首页 > 解决方案 > 使用 just_audio 和 audio_service 播放用户在 mediaItem 上停止的位置

问题描述

我正在开发一个播客应用程序,该应用程序的一个功能是它可以保存用户离开播客以播放另一个播客或完全离开应用程序的位置。如果不首先使用播客播放所述播客并寻找用户停止使用的位置,我找不到从其lastPlayed时间戳播放已保存播客的方法。使用这种播放方法,我得到了这个错误:播客从头开始播放,而不是应该在哪里播放。有什么建议么?audioHandler.play()audioHandler.seek(lastPlayed)

W/System.err(27454): com.google.android.exoplayer2.IllegalSeekPositionException W/System.err(27454): 在 com.google.android.exoplayer2.ExoPlayerImpl.seekTo(ExoPlayerImpl.java:611) W/System。错误(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$IncomingMethodCallHandler.onMessage( MethodChannel.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(Native Method) 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(Native Method) 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): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] 未处理异常:PlatformException(非法状态:null,null,空,空)在 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(Native Method) 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): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:PlatformException(非法状态:空,空,空,空)在 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(Native Method) 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): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:PlatformException(非法状态:空,空,空,空)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)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)

标签: androidiosflutterjust-audioaudio-service

解决方案


您可以通过两种方式实现此目的:

  1. 等待seek完成后再调用play。或者,
  2. initialPosition使用just_audio's的参数在特定位置预加载音频setAudioSource

我会尝试在您的音频处理程序内部透明地处理播放器保存位置的恢复。这样,您的音频处理程序的客户端将不需要知道它是如何处理的,只需audioHandler.play()在它想要播放时调用,并且音频处理程序将在内部知道从哪个位置开始播放。

实现这一点的方法是从音频处理程序的构造函数中恢复播放器的状态。例如,您的音频处理程序的初始化代码可能包括:

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

你得到一个是IllegalSeekPositionException因为 Android 上的 ExoPlayer 库认为你正在寻找一个不在该文件时间线内的位置。您可能想要检查与持续时间相比的搜索位置的值,并确保它更小。


推荐阅读