Just Audio中通知栏图标自定义操作及主播放动作变更监听咨询
Just Audio播放控制动作监听实现方案
你的核心需求不需要单独修改通知栏按钮的底层实现,Just Audio本身已经统一封装了所有来自通知栏、系统媒体控制、界面交互的播放动作事件,直接使用内置回调即可完成需求。
方案1:拦截动作并插入自定义逻辑(支持通知栏点击触发)
如果你使用just_audio_background实现后台播放与通知栏控制,直接重写AudioHandler的对应动作方法,在默认逻辑执行前插入你的自定义功能即可:
class CustomAudioHandler extends BaseAudioHandler with SeekHandler { final AudioPlayer _player = AudioPlayer(); // 重写下一曲触发逻辑 @override Future<void> skipToNext() async { // 插入你的自定义功能代码 runYourCustomNextAction(); // 执行默认下一曲逻辑 await _player.seekToNext(); super.skipToNext(); } // 重写上一曲触发逻辑 @override Future<void> skipToPrevious() async { runYourCustomPrevAction(); await _player.seekToPrevious(); super.skipToPrevious(); } // 重写暂停触发逻辑 @override Future<void> pause() async { runYourCustomPauseAction(); await _player.pause(); super.pause(); } // 其他需要自定义的动作均可重写对应方法,包括play、seekTo、skipToQueueItem等 }
该方案可以精准捕获用户主动点击通知栏按钮、耳机线控、系统媒体面板触发的对应动作,不会捕获自动切歌等非用户主动触发的事件。
方案2:轻量监听状态变更
如果你不需要拦截动作,仅需要在动作发生后执行逻辑,直接监听AudioPlayer内置的状态流即可,不需要修改AudioHandler:
final _player = AudioPlayer(); // 监听暂停/播放状态变更 _player.playingStream.listen((isPlaying) { if (isPlaying) { // 播放触发后的逻辑 } else { // 暂停触发后的逻辑 } }); // 监听歌曲切换事件(支持所有切歌场景) int? lastIndex; _player.currentIndexStream.listen((newIndex) { if (newIndex == null || newIndex == lastIndex) return; // 可通过新旧index对比判断是上一曲还是下一曲操作 if (lastIndex != null) { if (newIndex > lastIndex!) { // 下一曲触发逻辑 } else if (newIndex < lastIndex!) { // 上一曲触发逻辑 } } lastIndex = newIndex; });
该方案会捕获所有触发状态变更的场景,包括代码调用、自动切歌、用户主动操作等所有情况。
内容的提问来源于stack exchange,提问作者Sh4msi
相关产品推荐
相关产品推荐

