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.skipToNext
或
AudioService.skipToNext();
来自 Flutter UI.
它不工作,即 next pressed
没有显示在控制台中并且音频不工作。
我是不是做错了什么?
没有人排队可以按MediaControl.skipToNext
吗?
如果我做不到,我该如何实现这样的功能?
注意:我正在使用 just_audio
播放音频
编辑:这是我的 systemActions
systemActions: [
MediaAction.seekTo,
MediaAction.seekForward,
MediaAction.seekBackward,
MediaAction.skipToNext,
MediaAction.skipToPrevious,
],
已解决:onSkipToNext()
的不正确实施是已接受答案所暗示的问题所在。
假设其他一切正常,只有这两个跳过操作无效,您需要做的第一件事是在 controls
中包含 skipToNext
和 skipToPrevious
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 一个闭包 () { ... }
因此即使调用了此回调,也不会调用闭包内的代码。所以你需要将 => () { ... }
替换为 { ... }
.
我有一个包含不同部分的长音频文件。
我有一个 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()
的不正确实施是已接受答案所暗示的问题所在。
假设其他一切正常,只有这两个跳过操作无效,您需要做的第一件事是在 controls
中包含 skipToNext
和 skipToPrevious
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 一个闭包 () { ... }
因此即使调用了此回调,也不会调用闭包内的代码。所以你需要将 => () { ... }
替换为 { ... }
.