// lib/services/audio_player_handler.dart import 'package:flutter/foundation.dart'; import 'package:audio_service/audio_service.dart' as audio_service; import '../audio/player_controller.dart'; import '../audio/playback_state_manager.dart'; import '../services/audio_service.dart'; // 你自己的业务 AudioService class AudioPlayerHandler extends audio_service.BaseAudioHandler { final PlayerController _player = PlayerController(); final PlaybackStateManager _state = PlaybackStateManager(); AudioPlayerHandler() { // ---- 监听播放状态变化,同步到通知栏 ---- _player.playingStream.listen((playing) { _state.updatePlaying(playing); _publishState(); }); _player.positionStream.listen((position) { _state.updatePosition(position); final current = playbackState.value; playbackState.add(audio_service.PlaybackState( controls: current.controls, processingState: current.processingState, playing: current.playing, androidCompactActionIndices: current.androidCompactActionIndices, updateTime: DateTime.now(), )); }); _player.durationStream.listen((duration) { _state.updateDuration(duration); _publishState(); }); // ⭐ 已删除 completed 监听,交由 AudioService 统一处理 // _player.completedStream.listen((_) { ... }); } void _publishState() { playbackState.add(_state.playbackState); } void updateNotification({ required String id, required String title, required String artist, }) { debugPrint('📢 [handler] updateNotification: $title'); mediaItem.add(audio_service.MediaItem( id: id, title: title, artist: artist, duration: _player.duration, )); } // ---- 系统控制命令 ---- @override Future play() async { debugPrint('▶️ [handler] play() called'); _player.play(); } @override Future pause() async { debugPrint('⏸️ [handler] pause() called'); _player.pause(); } @override Future stop() async { debugPrint('⏹️ [handler] stop() called'); _player.stop(); } @override Future seek(Duration position) async { debugPrint('⏩ [handler] seek() called: $position'); _player.seek(position); } @override Future skipToNext() async { debugPrint('⏭️ [handler] skipToNext() called'); AudioService().next(); } @override Future skipToPrevious() async { debugPrint('⏮️ [handler] skipToPrevious() called'); AudioService().previous(); } @override Future click( [audio_service.MediaButton button = audio_service.MediaButton.media]) async { debugPrint('🎯 [handler] click() called with button: ${button.name}'); switch (button) { case audio_service.MediaButton.next: await skipToNext(); break; case audio_service.MediaButton.previous: await skipToPrevious(); break; case audio_service.MediaButton.media: if (_player.isPlaying) { await pause(); } else { await play(); } break; default: // 其他按钮 fallback if (_player.isPlaying) { await pause(); } else { await play(); } } } }