91 lines
2.2 KiB
Dart
91 lines
2.2 KiB
Dart
// 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<void> play() async {
|
|
_playback.resume();
|
|
}
|
|
|
|
@override
|
|
Future<void> pause() async {
|
|
_playback.pause();
|
|
}
|
|
|
|
@override
|
|
Future<void> stop() async {
|
|
_playback.stop();
|
|
}
|
|
|
|
@override
|
|
Future<void> seek(Duration position) async {
|
|
_playback.seek(position);
|
|
}
|
|
|
|
@override
|
|
Future<void> skipToNext() async {
|
|
_localAudio.next();
|
|
}
|
|
|
|
@override
|
|
Future<void> skipToPrevious() async {
|
|
_localAudio.previous();
|
|
}
|
|
|
|
@override
|
|
Future<void> click([MediaButton button = MediaButton.media]) async {
|
|
// 默认行为:打开 App
|
|
}
|
|
}
|