首页 > 解决方案 > Flutter audio_service 实现无队列的skipToNext

问题描述

我有一个包含不同部分的长音频文件。我有一个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.skipToNext但是当我从通知或 AudioService.skipToNext();Flutter UI 中按下时。

它不起作用,即next pressed控制台中没有显示,音频也不起作用。

难道我做错了什么?MediaControl.skipToNext如果没有队列,我不能按吗?

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

注意:我just_audio用于播放音频

编辑:这是我的systemActions

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

onSkipToNext()已解决:正如接受的答案所暗示的那样,问题的情况是错误的实施。

标签: flutteraudionotifications

解决方案


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

如果您希望这些队列跳过操作在 Android 上运行,您还必须传递androidEnableQueue: true给。AudioService.start

为了完整起见,我还要提一下,除非您在AndroidManifest.xml文件中声明了广播接收器,否则所有通知按钮(或耳机按钮)都不会在 Android 上工作:

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

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


推荐阅读