Flutter audio_service 实现无队列的 skipToNext

Flutter audio_service implement skipToNext without queue

我有一个包含不同部分的长音频文件。 我有一个 Map 包含这些部分的开始位置。

我想为它实现 skipToNext()skipToPrevious 方法。

我可以访问 BackgroundAudioTask 中的地图。

我已经实现了 onSkipToNext 这样的:

 @override
  Future<void> onSkipToNext() async => () {
        print('next pressed');
        final currentIndex = _getCurrentTrackIndex(_player.position);
        print(currentIndex);
        if (currentIndex < _tracks.length - 1) {
          _player.seek(
            Duration(milliseconds: _tracks[currentIndex + 1]['start']),
          );
        }
      };

_tracks 看起来像这样:

[{id: 1, title: INTRODUCTION, start: 0}, {id: 2, title: Next track, start: 68347},]

但是当我在通知中按 MediaControl.skipToNextAudioService.skipToNext(); 来自 Flutter UI.

它不工作,即 next pressed 没有显示在控制台中并且音频不工作。

我是不是做错了什么? 没有人排队可以按MediaControl.skipToNext吗?

如果我做不到,我该如何实现这样的功能?

注意:我正在使用 just_audio 播放音频

编辑:这是我的 systemActions

systemActions: [
  MediaAction.seekTo,
  MediaAction.seekForward,
  MediaAction.seekBackward,
  MediaAction.skipToNext,
  MediaAction.skipToPrevious,
],

已解决:onSkipToNext() 的不正确实施是已接受答案所暗示的问题所在。

假设其他一切正常,只有这两个跳过操作无效,您需要做的第一件事是在 controls 中包含 skipToNextskipToPrevious AudioServiceBackground.setState 而不是 systemActions 的参数。 systemActions 仅适用于不可点击的按钮(例如 seekTo)。

如果您希望这些 queue-skipping 操作在 Android 上起作用,您还必须将 androidEnableQueue: true 传递给 AudioService.start

为了完整起见,我还要提到通知按钮(或耳机按钮)的 none 将在 Android 上工作,除非您在 [=20= 中声明了广播接收器] 文件:

        <receiver android:name="com.ryanheise.audioservice.MediaButtonReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_BUTTON" />
            </intent-filter>
        </receiver> 

但除此之外,我注意到您的代码包含一个与 audio_service 无关的细微编程错误。 onSkipToNext 的实现只是 returns 一个闭包 () { ... } 因此即使调用了此回调,也不会调用闭包内的代码。所以你需要将 => () { ... } 替换为 { ... }.