You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:48:01