From 50c3d1fc0570285181ff7686f1b751e526f22ef9 Mon Sep 17 00:00:00 2001 From: fdp <1286779656@qq.com> Date: Thu, 3 Jul 2025 16:42:02 +0800 Subject: [PATCH] add --- devtools_options.yaml | 3 +++ lib/data/services/music_manager.dart | 2 +- .../agent/controllers/agent_controller.dart | 19 +++++++-------- lib/modules/agent/views/message_bubble.dart | 9 +++++--- lib/modules/agent/views/music_card.dart | 6 +++-- .../music_service/MusicService.kt | 23 ++++++++++++------- .../music_service/lib/music_service.dart | 5 ++-- 7 files changed, 42 insertions(+), 25 deletions(-) create mode 100644 devtools_options.yaml diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 000000000..fa0b357c4 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/data/services/music_manager.dart b/lib/data/services/music_manager.dart index 51975424f..621cd927c 100644 --- a/lib/data/services/music_manager.dart +++ b/lib/data/services/music_manager.dart @@ -105,7 +105,7 @@ class MusicManager extends GetxService { required Function() onPrevious, required Function(int) onSeekTo, required Function() onStop, - required Function(int, int, int, double) onStop1, + required Function(String, int, int, double) onStop1, }) async { try { await _musicService.setMediaSessionCallbacks( diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 11ce214b8..adf43b71a 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -1401,7 +1401,7 @@ class AgentController extends GetxController { await _musiceManager.play(musicData); // 更新媒体会话元数据和播放状态 - await _updateMediaSessionMetadata(song); + await _updateMediaSessionMetadata(musicData); await _updateMediaSessionPlaybackState(true); // 启动进度定时器 @@ -1514,11 +1514,12 @@ class AgentController extends GetxController { } // 获取播放进度 - Future updateMusicProgress1(int currentIdInternal, int newPosition, + Future updateMusicProgress1(String currentIdInternal, int newPosition, int newDuration, double newProgress) async { try { - if (!isPlaying.value || currentId.value == 0) { - return; // 如果没有在播放,直接返回 + if (int.parse(currentIdInternal) != 0) { + isPlaying.value = true; + // return; // 如果没有在播放,直接返回 } // // var progressInfo = await _musiceManager.getProgress(); @@ -1528,8 +1529,8 @@ class AgentController extends GetxController { print( "updateMusicProgress1:currentIdInternal:$currentIdInternal newPosition:$newPosition newDuration:$newDuration newProgress:$newProgress"); bool hasUpdate = false; - if (currentId.value != currentIdInternal && currentIdInternal != 0) { - currentId.value = currentIdInternal; + if (currentId.value != int.parse(currentIdInternal)) { + currentId.value = int.parse(currentIdInternal); hasUpdate = true; } // 只有当值发生变化时才更新,避免不必要的UI刷新 @@ -1602,7 +1603,7 @@ class AgentController extends GetxController { } // 跳转到指定位置 - Future seekToPosition1(int currentIdInternal, int newPosition, + Future seekToPosition1(String currentIdInternal, int newPosition, int newDuration, double newProgress) async { try { //await _musiceManager.seekTo(positionMs); @@ -1829,10 +1830,10 @@ class AgentController extends GetxController { } /// 处理来自系统通知栏的跳转操作 - Future onMediaSessionSeekTo1(int currentIdInternal, int newPosition, + Future onMediaSessionSeekTo1(String currentIdInternal, int newPosition, int newDuration, double newProgress) async { print( - "onMediaSessionSeekTo1 newPosition:$newPosition newDuration:$newDuration newProgress:$newProgress"); + "onMediaSessionSeekTo1 currentIdInternal :$currentIdInternal ,newPosition:$newPosition newDuration:$newDuration newProgress:$newProgress"); await seekToPosition1( currentIdInternal, newPosition, newDuration, newProgress); } diff --git a/lib/modules/agent/views/message_bubble.dart b/lib/modules/agent/views/message_bubble.dart index 0c4e2d782..51f7cf8e2 100644 --- a/lib/modules/agent/views/message_bubble.dart +++ b/lib/modules/agent/views/message_bubble.dart @@ -240,9 +240,11 @@ class MessageBubble extends GetView { final musicUrl = card_music['url'] as String? ?? ''; final musicSinger = card_music['sgener'] as String? ?? '未知歌手'; final musicImage = card_music['image'] as String? ?? ''; + final ts = card_music['ts'] as int? ?? 0; + print("music_play card_music: $card_music"); //音乐卡片 - return buildMusicItem( - context, musicId, musicName, musicUrl, musicSinger, musicImage); + return buildMusicItem(context, musicId, musicName, musicUrl, + musicSinger, musicImage, ts); } } else if (meta!.keys.contains('music_playlist')) { final card_musiclist = @@ -281,7 +283,8 @@ class MessageBubble extends GetView { final end = card_navigation['end'] as String? ?? ''; final destination = card_navigation['destination'] as String? ?? ''; final rawList = card_navigation['items'] as List? ?? []; - final list = rawList.map((e) => Map.from(e)).toList(); + final list = + rawList.map((e) => Map.from(e)).toList(); final rawNavigation = card_navigation['navigation']; final Map? navigation = rawNavigation is Map ? rawNavigation : null; diff --git a/lib/modules/agent/views/music_card.dart b/lib/modules/agent/views/music_card.dart index ecc1e0fe1..f4af0c4fb 100644 --- a/lib/modules/agent/views/music_card.dart +++ b/lib/modules/agent/views/music_card.dart @@ -6,7 +6,7 @@ import 'circular_progress_button.dart'; /// 构建音乐项目 Widget buildMusicItem(BuildContext context, int id, String name, String url, - String singer, String image) { + String singer, String image, int ts) { final controller = Get.find(); // 获取控制器 final isDarkMode = Theme.of(context).brightness == Brightness.dark; Map song = { @@ -15,6 +15,7 @@ Widget buildMusicItem(BuildContext context, int id, String name, String url, 'title': name, 'artist': singer, 'coverUrl': image, + 'ts': ts, }; controller.musicStatus(); //刷新状态 @@ -204,9 +205,10 @@ Widget buildMusicContent( final url = item["url"] ?? ""; final singer = item["sgener"] ?? "未知歌手"; final image = item["image"] ?? ""; + final ts = item["ts"] ?? 0; return Column( children: [ - buildMusicItem(context, id, name, url, singer, image), + buildMusicItem(context, id, name, url, singer, image, ts), if (index != playlist.length - 1) Divider( height: 1, diff --git a/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt b/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt index 84964300a..98c400caa 100644 --- a/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt +++ b/local_plugins/music_service/android/src/main/kotlin/com/yunqiinnovation/music_service/MusicService.kt @@ -38,7 +38,7 @@ class MusicService : MediaBrowserServiceCompat() { private const val DELETE_ACTION = "com.yunqiinnovation.music_service.DELETE_NOTIFICATION" private val isRunning = AtomicBoolean(false) - private var currentIdInternal: Int? = null + private var currentIdInternal: String? = null private var currentStatus = false private var playlist = mutableListOf>() private var currentIndex = 0 @@ -48,7 +48,7 @@ class MusicService : MediaBrowserServiceCompat() { fun isServiceRunning() = isRunning.get() fun isPlaying() = currentStatus - fun getCurrentId(): Int? = currentIdInternal + fun getCurrentId(): String? = currentIdInternal // // 获取播放进度信息 // fun getProgress(): Map { @@ -121,7 +121,8 @@ class MusicService : MediaBrowserServiceCompat() { val title = song["title"] as? String ?: song["name"] as? String ?: "未知标题" val artist = song["artist"] as? String ?: song["sgener"] as? String ?: "未知歌手" val coverUrl = song["coverUrl"] as? String ?: song["image"] as? String ?: "" -currentIdInternal = song["id"] as? Int ?: song["id"] as? Int ?: 0 +currentIdInternal = song["id"] as? String ?: song["id"] as? String ?: "0" + Log.i(TAG, "updateMediaSessionMetadata currentIdInternal: $currentIdInternal") val metadata = android.support.v4.media.MediaMetadataCompat.Builder() .putString(android.support.v4.media.MediaMetadataCompat.METADATA_KEY_TITLE, title) .putString(android.support.v4.media.MediaMetadataCompat.METADATA_KEY_ARTIST, artist) @@ -238,8 +239,10 @@ private fun updateProgress() { "play" -> intent.getSerializableExtra("song")?.let { url -> val songMap = intent.getSerializableExtra("song") as? Map songMap?.let { song -> - val songId = song["id"] ?: return@let - // currentIdInternal = songId + val songId = song["id"]as? String ?:"0" + Log.i(TAG, "command songId: $songId") + currentIdInternal = songId + val existingIndex = playlist.indexOfFirst { it["id"] == songId } if (existingIndex == -1) { playlist.add(song) @@ -547,13 +550,15 @@ private fun updateProgress() { private fun play(song: Map) { val url = song["url"] as? String ?: return Log.i(TAG, "开始播放: $url") - val id = song["id"] as? Int ?: 0 + val id = song["id"] as? String ?: "0" + Log.i(TAG, "开始播放play id: $id") val title = song["title"] as? String ?: "未知标题" val artist = song["artist"] as? String ?: "未知歌手" val coverUrl = song["coverUrl"] as String mediaPlayer?.release() currentStatus = true currentIdInternal = id + Log.i(TAG, "开始播放play currentIdInternal: $currentIdInternal") mediaPlayer = MediaPlayer().apply { setDataSource(url) setAudioStreamType(AudioManager.STREAM_MUSIC) @@ -585,7 +590,8 @@ private fun updateProgress() { val title = song["title"] as? String ?: "未知标题" val artist = song["artist"] as? String ?: "未知歌手" val coverUrl = song["coverUrl"] as String - val id = song["id"] as? Int ?: 0 + val id = song["id"] as? String ?: "0" + Log.i(TAG, "pause id: $id") currentIdInternal = id updateNotification(title,artist,coverUrl) setPlaybackState(PlaybackStateCompat.STATE_PAUSED); @@ -605,7 +611,8 @@ private fun updateProgress() { val title = song["title"] as? String ?: "未知标题" val artist = song["artist"] as? String ?: "未知歌手" val coverUrl = song["coverUrl"] as String - val id = song["id"] as? Int ?: 0 + val id = song["id"] as? String ?: "0" + Log.i(TAG, "resume id: $id") currentIdInternal = id updateNotification(title,artist,coverUrl) setPlaybackState(PlaybackStateCompat.STATE_PLAYING); diff --git a/local_plugins/music_service/lib/music_service.dart b/local_plugins/music_service/lib/music_service.dart index 4c59cd5c0..8be33fe68 100644 --- a/local_plugins/music_service/lib/music_service.dart +++ b/local_plugins/music_service/lib/music_service.dart @@ -101,7 +101,7 @@ class MusicService { required Function() onPrevious, required Function(int) onSeekTo, required Function() onStop, - required Function(int, int, int, double) onStop1, + required Function(String, int, int, double) onStop1, }) async { // 设置方法调用处理器来处理来自原生平台的回调 _methodChannel.setMethodCallHandler((call) async { @@ -126,7 +126,8 @@ class MusicService { onStop(); break; case 'onMediaSessionSeekTo1': - final currentIdInternal = call.arguments['currentIdInternal'] as int; + final currentIdInternal = + call.arguments['currentIdInternal'] as String; final currentPosition = call.arguments['currentPosition'] as int; final duration = call.arguments['duration'] as int; final progress = call.arguments['progress'] as double;