我正在开发一个应用程序,允许用户浏览一系列电子书,选择一本,然后决定阅读或收听它。还可以在阅读和听力之间切换。因此,有单独的视图用于收听、阅读或浏览有声读物。
我正在使用 Flutter 插件:audio_service 和 just_audio 来实现有声读物播放。在应用程序单元期间,我创建了自己的 AudioHandler,如下所示:
class AudioHandler extends BaseAudioHandler with SeekHandler {
static final AudioHandler _singleton = AudioHandler._();
static Future<void> init() async {
var audioService = await AudioService.init(
builder: () => AudioHandler(),
config: const AudioServiceConfig(
androidNotificationChannelId: 'nl.dropcatcher.sermons.channel.audio',
androidNotificationChannelName: 'Sermon playback',
androidStopForegroundOnPause: false,
fastForwardInterval: Duration(seconds: 10),
rewindInterval: Duration(seconds: 10),
),
);
audioService.playbackState.add(PlaybackState(
controls: [
MediaControl.pause,
],
systemActions: const {
MediaAction.seek,
MediaAction.seekForward,
MediaAction.seekBackward,
},
androidCompactActionIndices: const [0],
processingState: AudioProcessingState.buffering,
playing: false,
updatePosition: Duration.zero,
bufferedPosition: Duration.zero,
speed: 1.0,
queueIndex: 0,
));
}
factory AudioHandler() {
return _singleton;
}
AudioHandler._();
}
然后在有声读物播放器视图中,我使用 AudioPlayer 播放实际的有声读物并在视图关闭时将其释放:
class _SermonPlayerState extends State<_SermonPlayerWidget> {
final AudioPlayer player = AudioPlayer();
@override
void initState() {
// ...
player.play();
}
@override
void dispose() {
// ...
AudioHandler().stop();
player.dispose();
super.dispose();
}
}
但是,带有播放器控制按钮的 Android 通知(当 AudioPlayer 开始播放时由 audio_service 创建)在 dispose() 之后仍然存在,即使它不再适用。事实上,当我从 Flutter 调试器重新加载应用程序时,它甚至仍然存在。更令人困惑的是,在 Web 版本中,它起作用了 - 一旦 AudioPlayer 被释放,带有播放器按钮的浏览器通知就会消失。
我看不到任何以编程方式隐藏通知的 API。那么当用户不再位于音频播放器页面时如何摆脱它呢?
我遇到了同样的问题,你找到解决方案了吗?