android - 使用 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)
解决方案
您可以通过两种方式实现此目的:
- 等待
seek
完成后再调用play
。或者, initialPosition
使用just_audio's的参数在特定位置预加载音频setAudioSource
。
我会尝试在您的音频处理程序内部透明地处理播放器保存位置的恢复。这样,您的音频处理程序的客户端将不需要知道它是如何处理的,只需audioHandler.play()
在它想要播放时调用,并且音频处理程序将在内部知道从哪个位置开始播放。
实现这一点的方法是从音频处理程序的构造函数中恢复播放器的状态。例如,您的音频处理程序的初始化代码可能包括:
player = AudioPlayer();
await player.setAudioSource(source,
initialPosition: savedPosition);
你得到一个是IllegalSeekPositionException
因为 Android 上的 ExoPlayer 库认为你正在寻找一个不在该文件时间线内的位置。您可能想要检查与持续时间相比的搜索位置的值,并确保它更小。
推荐阅读
- python-3.x - 将 matplotlib 文本颜色更改为白色 (#FFFFFF) 会干扰图像输出
- etl - 有什么方法可以自动从 Youtube Analytics 端点获取指标?
- google-analytics - google analytics api -- 获取每个客户端 ID 的用户存储桶分数
- php - `INSERT INTO SELECT` 根据运行查询的客户端转换值
- python - TypeError: __call__(): 不兼容的函数参数。支持以下参数类型:
- r - 反转正则表达式:允许错误的 grep
- c++ - Clang libtooling 标头错误
- asp.net-core - 在 C# ASP.NET Core .NET 中解析 json 时出错
- java - 如何在spring boot rest控制器中仅在某些端点上启用http,在其他一些端点上启用https?
- sql - 在 sql/json (Oracle 数据库) 中构造嵌套的 JSON 值