现阶段通知中心播放暂停切换功能已实现,但是上下一曲功能暂时消失,需要后续优化,这个commit是snapshot
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
// lib/audio/playback_state_manager.dart
|
||||
import 'package:audio_service/audio_service.dart' as audio_service;
|
||||
|
||||
class PlaybackStateManager {
|
||||
static final PlaybackStateManager _instance =
|
||||
PlaybackStateManager._internal();
|
||||
factory PlaybackStateManager() => _instance;
|
||||
PlaybackStateManager._internal();
|
||||
|
||||
bool _playing = false;
|
||||
bool get playing => _playing;
|
||||
|
||||
Duration _position = Duration.zero;
|
||||
Duration get position => _position;
|
||||
|
||||
Duration _duration = Duration.zero;
|
||||
Duration get duration => _duration;
|
||||
|
||||
// ⭐ 核心改动:使用 playPause 替代 play/pause 分离
|
||||
audio_service.PlaybackState get playbackState {
|
||||
// ⭐ 固定使用 playPause,不再动态切换
|
||||
final playControl = audio_service.MediaControl(
|
||||
androidIcon: _playing ? 'drawable/ic_pause' : 'drawable/ic_play',
|
||||
label: _playing ? '暂停' : '播放',
|
||||
action: audio_service.MediaAction.playPause, // 固定
|
||||
);
|
||||
|
||||
final controls = [
|
||||
audio_service.MediaControl(
|
||||
androidIcon: 'drawable/ic_previous',
|
||||
label: '上一曲',
|
||||
action: audio_service.MediaAction.skipToPrevious,
|
||||
),
|
||||
playControl,
|
||||
audio_service.MediaControl(
|
||||
androidIcon: 'drawable/ic_next',
|
||||
label: '下一曲',
|
||||
action: audio_service.MediaAction.skipToNext,
|
||||
),
|
||||
];
|
||||
|
||||
return audio_service.PlaybackState(
|
||||
controls: controls,
|
||||
processingState: audio_service.AudioProcessingState.ready,
|
||||
playing: _playing, // ⭐ 这里才是真正的播放状态,通知栏会根据它显示正确的图标
|
||||
androidCompactActionIndices: const [0, 1, 2],
|
||||
updateTime: DateTime.now(),
|
||||
//extras: {'_refresh': DateTime.now().millisecondsSinceEpoch},
|
||||
);
|
||||
}
|
||||
|
||||
// ---- 状态更新方法保持不变 ----
|
||||
void updatePlaying(bool playing) {
|
||||
if (_playing != playing) {
|
||||
_playing = playing;
|
||||
}
|
||||
}
|
||||
|
||||
void updatePosition(Duration position) {
|
||||
_position = position;
|
||||
}
|
||||
|
||||
void updateDuration(Duration duration) {
|
||||
_duration = duration;
|
||||
}
|
||||
|
||||
void reset() {
|
||||
_playing = false;
|
||||
_position = Duration.zero;
|
||||
_duration = Duration.zero;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user