diff --git a/lib/modules/music/views/music_playlist_view.dart b/lib/modules/music/views/music_playlist_view.dart index e6b6d00f0..16a7dfaf5 100644 --- a/lib/modules/music/views/music_playlist_view.dart +++ b/lib/modules/music/views/music_playlist_view.dart @@ -546,6 +546,13 @@ class MusicPlaylistView extends StatelessWidget { child: Slider( value: controller.progress.value.clamp(0.0, 1.0), onChanged: (value) { + // 拖动中仅更新UI显示,不触发实际跳转 + controller.progress.value = value; + controller.currentPosition.value = + (controller.duration.value * value).round(); + }, + onChangeEnd: (value) { + // 松开时再执行跳转,确保拖动自然 final targetPosition = (controller.duration.value * value).round(); controller.seekToPosition(targetPosition); diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index 22c510c59..fb10d82f8 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -426,7 +426,7 @@ object AgentService : CoroutineScope { setPackage(context.packageName) } context.sendBroadcast(intent) - Log.e(TAG, "QQ 音乐暂停播放") + // Log.e(TAG, "QQ 音乐暂停播放") autopauseMusic() // QQMusicSingleton.getInstance().autopauseMusic { result -> // if (result.isSuccess) { diff --git a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift index 09a71692e..506a596bd 100644 --- a/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift +++ b/local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift @@ -182,8 +182,8 @@ class AgentServiceImpl: NSObject { self.config = config if let navigationMode = config["navigationMode"] as? String { - self.navigationMode = navigationMode - } + self.navigationMode = navigationMode + } if let callingToolText = config["callingToolText"] as? String { self.callingToolText = callingToolText diff --git a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/MCPClient.swift b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/MCPClient.swift index cf9ed3bde..c2da48b8d 100644 --- a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/MCPClient.swift +++ b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/MCPClient.swift @@ -431,7 +431,7 @@ public class MCPClient { public init(musicServiceType: String) { initializeSystemFunctions() - + print("musicServiceType: \(musicServiceType)") switch musicServiceType { case "WY": initializeMusicSystemFunction() // 更明确的命名 diff --git a/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift b/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift index 88c258c8c..c13217297 100644 --- a/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift +++ b/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift @@ -565,7 +565,14 @@ public class MusicService: NSObject { // 记录当前播放状态 let wasPlaying = isPlaying - let time = CMTime(seconds: Double(positionMs) / 1000.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC)) + // 幂等短路:相同位置重复seek直接忽略 + let currentSeconds = CMTimeGetSeconds(player.currentTime()) + if !currentSeconds.isNaN && !currentSeconds.isInfinite { + let currentMs = Int(currentSeconds * 1000) + if currentMs == positionMs { return } + } + + let time: CMTime = CMTime(seconds: Double(positionMs) / 1000.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC)) player.seek(to: time) { [weak self] completed in if completed { @@ -575,15 +582,10 @@ public class MusicService: NSObject { if wasPlaying { self?.player?.play() self?.isPlaying = true - self?.updateMediaSessionPlaybackState(isPlaying: true) - self?.startProgressTimer() } // 立即更新进度信息到系统媒体控制中心 self?.updateProgressInfoImmediately() - - // 通知Flutter层 - self?.flutterChannel?.invokeMethod("onMediaSessionSeekTo", arguments: ["position": positionMs]) } } }