引入部分缓存机制
引入封面图信息 正在进入测试阶段
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
// lib/services/audio_player_handler.dart
|
||||
|
||||
import 'dart:io'; // ⭐ 添加
|
||||
import 'dart:typed_data'; // ⭐ 添加
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:audio_service/audio_service.dart' as audio_service;
|
||||
import '../audio/player_controller.dart';
|
||||
@@ -53,22 +54,6 @@ class AudioPlayerHandler extends audio_service.BaseAudioHandler {
|
||||
});
|
||||
}
|
||||
|
||||
void _updateMediaItemPosition(Duration position) {
|
||||
final currentMediaItem = mediaItem.value;
|
||||
if (currentMediaItem != null) {
|
||||
mediaItem.add(audio_service.MediaItem(
|
||||
id: currentMediaItem.id,
|
||||
title: currentMediaItem.title,
|
||||
artist: currentMediaItem.artist,
|
||||
duration: currentMediaItem.duration,
|
||||
extras: {
|
||||
'position': position.inMilliseconds,
|
||||
...?currentMediaItem.extras,
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
void _publishState() {
|
||||
final state = _state.playbackState;
|
||||
playbackState.add(audio_service.PlaybackState(
|
||||
@@ -111,38 +96,76 @@ class AudioPlayerHandler extends audio_service.BaseAudioHandler {
|
||||
);
|
||||
}
|
||||
|
||||
void updateNotification({
|
||||
required String id,
|
||||
required String title,
|
||||
required String artist,
|
||||
Uint8List? artwork,
|
||||
}) {
|
||||
_updateMediaItem(
|
||||
id: id,
|
||||
title: title,
|
||||
artist: artist,
|
||||
artwork: artwork,
|
||||
);
|
||||
}
|
||||
|
||||
void _updateMediaItem({
|
||||
required String id,
|
||||
required String title,
|
||||
required String artist,
|
||||
Duration? duration,
|
||||
Uint8List? artwork,
|
||||
}) {
|
||||
_currentId = id;
|
||||
_currentTitle = title;
|
||||
_currentArtist = artist;
|
||||
final position = _player.position;
|
||||
|
||||
debugPrint(
|
||||
'📢 [handler] updateMediaItem: $title - $artist (position=${position.inSeconds}s)');
|
||||
debugPrint('📢 [handler] updateMediaItem: $title - $artist');
|
||||
|
||||
// ⭐ 如果有 artwork,保存为临时文件并设置 artUri
|
||||
Uri? artUri;
|
||||
if (artwork != null && artwork.isNotEmpty) {
|
||||
try {
|
||||
final tempDir = Directory.systemTemp;
|
||||
final artPath = '${tempDir.path}/art_${id.hashCode}.jpg';
|
||||
final artFile = File(artPath);
|
||||
artFile.writeAsBytesSync(artwork);
|
||||
artUri = Uri.file(artPath);
|
||||
debugPrint('📢 [handler] artwork saved: $artPath');
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ [handler] save artwork failed: $e');
|
||||
}
|
||||
}
|
||||
|
||||
mediaItem.add(audio_service.MediaItem(
|
||||
id: id,
|
||||
title: title,
|
||||
artist: artist,
|
||||
duration: duration ?? _player.duration,
|
||||
artUri: artUri,
|
||||
extras: {
|
||||
'position': position.inMilliseconds,
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
void updateNotification({
|
||||
required String id,
|
||||
required String title,
|
||||
required String artist,
|
||||
}) {
|
||||
_updateMediaItem(id: id, title: title, artist: artist);
|
||||
_publishState();
|
||||
void _updateMediaItemPosition(Duration position) {
|
||||
final currentMediaItem = mediaItem.value;
|
||||
if (currentMediaItem != null) {
|
||||
mediaItem.add(audio_service.MediaItem(
|
||||
id: currentMediaItem.id,
|
||||
title: currentMediaItem.title,
|
||||
artist: currentMediaItem.artist,
|
||||
duration: currentMediaItem.duration,
|
||||
artUri: currentMediaItem.artUri,
|
||||
extras: {
|
||||
'position': position.inMilliseconds,
|
||||
...?currentMediaItem.extras,
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
import 'playback_service.dart';
|
||||
import '../metadata/metadata_service.dart';
|
||||
import 'dart:typed_data';
|
||||
|
||||
enum PlayMode {
|
||||
sequential,
|
||||
@@ -16,12 +17,14 @@ class Song {
|
||||
final String title;
|
||||
final String artist;
|
||||
final String? url;
|
||||
final Uint8List? artwork;
|
||||
|
||||
Song({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.artist,
|
||||
this.url,
|
||||
this.artwork,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -181,6 +184,8 @@ class AudioService extends ChangeNotifier {
|
||||
title: metadata.title.isNotEmpty ? metadata.title : song.title,
|
||||
artist: metadata.artist.isNotEmpty ? metadata.artist : song.artist,
|
||||
url: song.url,
|
||||
artwork: metadata.artwork,
|
||||
// ⭐ 如果需要传递 artwork,可以在这里添加字段
|
||||
);
|
||||
_queue[_currentIndex] = updatedSong;
|
||||
_currentSong = updatedSong;
|
||||
|
||||
Reference in New Issue
Block a user