// lib/services/audio_player_handler.dart import 'package:audio_service/audio_service.dart'; import 'playback_service.dart'; import 'audio_service.dart' as local_audio; class AudioPlayerHandler extends BaseAudioHandler { final PlaybackService _playback = PlaybackService(); late final local_audio.AudioService _localAudio; MediaItem? _currentMediaItem; AudioPlayerHandler() { _localAudio = local_audio.AudioService(); // 1. 监听播放状态(只更新 playing) _playback.player.stream.playing.listen((playing) { playbackState.add(playbackState.value.copyWith( playing: playing, )); }); // 2. ⭐ 进度更新:跳过,因为当前版本不支持 position 参数 // 通知栏进度条不会动,但播放/暂停/切歌功能正常 // 如果后续需要,可以升级 audio_service 版本或改用其他方案 // 3. 监听播放完成(触发下一首) _playback.player.stream.completed.listen((_) { _localAudio.next(); }); // 4. 监听时长变化,更新 MediaItem _playback.player.stream.duration.listen((duration) { if (_currentMediaItem != null) { _currentMediaItem = _currentMediaItem!.copyWith(duration: duration); mediaItem.add(_currentMediaItem); } }); } /// 外部调用更新通知栏 void updateNotification({ required String id, required String title, required String artist, }) { _currentMediaItem = MediaItem( id: id, title: title, artist: artist, duration: _playback.player.state.duration, ); mediaItem.add(_currentMediaItem); } // ---- AudioHandler 接口实现 ---- @override Future play() async { _playback.resume(); } @override Future pause() async { _playback.pause(); } @override Future stop() async { _playback.stop(); } @override Future seek(Duration position) async { _playback.seek(position); } @override Future skipToNext() async { _localAudio.next(); } @override Future skipToPrevious() async { _localAudio.previous(); } @override Future click([MediaButton button = MediaButton.media]) async { // 默认行为:打开 App } }