Browse Source

上传音乐修复

newdev_shunjiawei
liwei1dao 1 year ago
parent
commit
974ea540b7
  1. 0
      android/.kotlin/sessions/kotlin-compiler-2007526241707140332.salive
  2. 19
      lib/modules/agent/controllers/agent_controller.dart
  3. 2
      lib/modules/agent/views/message_bubble.dart
  4. 24
      local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt
  5. 15
      local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/QQMusicSystemFunctionHandler.kt

0
android/.kotlin/sessions/kotlin-compiler-2007526241707140332.salive

19
lib/modules/agent/controllers/agent_controller.dart

@ -755,7 +755,7 @@ class AgentController extends GetxController with WidgetsBindingObserver {
final responseId = event.data['responseId'] ?? ''; final responseId = event.data['responseId'] ?? '';
// final result = event.data['result']; // final result = event.data['result'];
final metaStr = event.data['meta'] ?? ''; final metaStr = event.data['meta'] ?? '';
// final functionCall = event.data['function_call'] ?? ''; final functionCall = event.data['function_call'] ?? '';
Logger.i(TAG, 'Flutter 结束调用 mcp: $metaStr'); Logger.i(TAG, 'Flutter 结束调用 mcp: $metaStr');
if (metaStr.isNotEmpty) { if (metaStr.isNotEmpty) {
Map<String, dynamic> metaResult = {}; Map<String, dynamic> metaResult = {};
@ -790,16 +790,7 @@ class AgentController extends GetxController with WidgetsBindingObserver {
); );
} }
} }
final musicKey = metaResult.keys.firstWhere( if (metaResult.containsKey("maps_route_navigation")) {
(key) => key.contains("music"),
orElse: () => "",
);
if (musicKey.isNotEmpty) {
Future.delayed(Duration(seconds: 1), () {
_qqmusicManager.syncCurrentPlayInfo(isOpenPlay: true);
});
// }
} else if (metaResult.containsKey("maps_route_navigation")) {
final maps_route_navigation = final maps_route_navigation =
metaResult["maps_route_navigation"]; metaResult["maps_route_navigation"];
if (maps_route_navigation is Map<String, dynamic>) { if (maps_route_navigation is Map<String, dynamic>) {
@ -858,6 +849,12 @@ class AgentController extends GetxController with WidgetsBindingObserver {
} }
} }
} }
if (functionCall.contains("music")) {
Future.delayed(Duration(seconds: 1), () {
_qqmusicManager.syncCurrentPlayInfo(isOpenPlay: false);
});
// }
}
break; break;
default: default:
break; break;

2
lib/modules/agent/views/message_bubble.dart

@ -160,7 +160,7 @@ class MessageBubble extends GetView<AgentController> {
); );
} }
if (!isUser && message.isEmpty) { if (!isUser && message.isEmpty && meta == null) {
return _buildTypingIndicator(); return _buildTypingIndicator();
} }

24
local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt

@ -1091,14 +1091,22 @@ object AgentService : CoroutineScope {
iscard = resultmap["iscard"] as Boolean; iscard = resultmap["iscard"] as Boolean;
if (iscard){ if (iscard){
aiMetadata = resultmap["meta"] as String; aiMetadata = resultmap["meta"] as String;
} sendEvent(
sendEvent( "function_call_result", mapOf(
"function_call_result", mapOf( "function_call" to functionCall.toString(),
"function_call" to functionCall.toString(), "result" to functionCallResult.toString(),
"result" to functionCallResult.toString(), "meta" to aiMetadata,
"meta" to aiMetadata, )
) )
) }else{
sendEvent(
"function_call_result", mapOf(
"function_call" to functionCall.toString(),
"result" to functionCallResult.toString(),
)
)
}
Log.e( Log.e(
TAG, TAG,
"liwei--------------- AI Call onFunctionCallResult broadcast:$broadcast reply:$reply iscard:$iscard" "liwei--------------- AI Call onFunctionCallResult broadcast:$broadcast reply:$reply iscard:$iscard"
@ -1940,7 +1948,7 @@ object AgentService : CoroutineScope {
} else { } else {
Log.w(TAG, "card_musiclist.musics 不是一个数组") Log.w(TAG, "card_musiclist.musics 不是一个数组")
} }
} else if (toolname == "qqmusic_searchandplay_songs" && meta.has("data")) { //qq音乐 } else if (toolname == "qqmusic_search_songs" && meta.has("data")) { //qq音乐
//"{\"mid\": \"$mid\", \"name\": \"$name\", \"artist\": \"$artist\", \"album\": \"$album\", \"duration\":$duration,\"pic\": \"$pic\"}" //"{\"mid\": \"$mid\", \"name\": \"$name\", \"artist\": \"$artist\", \"album\": \"$album\", \"duration\":$duration,\"pic\": \"$pic\"}"
val musics = meta.optJSONArray("data") val musics = meta.optJSONArray("data")
if (musics != null) { if (musics != null) {

15
local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/QQMusicSystemFunctionHandler.kt

@ -139,12 +139,22 @@ private class QQMusicSearchOnlyHandler(private val context: Context?) : Function
override suspend fun handle(arguments: Map<String, Any>): String { override suspend fun handle(arguments: Map<String, Any>): String {
return try { return try {
val keyword = arguments["keyword"] as? String ?: return "{\"success\": false, \"message\": \"缺少搜索关键词\"}" val keyword = arguments["keyword"] as? String ?: return "{\"success\": false, \"message\": \"缺少搜索关键词\"}"
val searchType = arguments["searchType"] as? Int ?: 0 // 默认搜索歌曲 val searchType = arguments["searchType"] as? Int ?: 0
val qqMusicSingleton = QQMusicSingleton.getInstance() val qqMusicSingleton = QQMusicSingleton.getInstance()
// 使用 suspendCoroutine 将回调转换为协程 // 使用 suspendCoroutine 将回调转换为协程,并添加防重复调用机制
suspendCoroutine { continuation -> suspendCoroutine { continuation ->
var isResumed = false // 添加标志防止重复调用
qqMusicSingleton.searchSongs(keyword) { searchResult -> qqMusicSingleton.searchSongs(keyword) { searchResult ->
// 检查是否已经恢复过协程
if (isResumed) {
Log.w("QQMusicSearchOnlyHandler", "检测到重复回调,忽略")
return@searchSongs
}
isResumed = true // 标记已处理
val result = if (searchResult.isSuccess) { val result = if (searchResult.isSuccess) {
val songs = searchResult.getOrNull() ?: emptyList() val songs = searchResult.getOrNull() ?: emptyList()
@ -181,6 +191,7 @@ private class QQMusicSearchOnlyHandler(private val context: Context?) : Function
val error = searchResult.exceptionOrNull() val error = searchResult.exceptionOrNull()
"{\"success\": false, \"message\": \"搜索失败: ${error?.message}\"}" "{\"success\": false, \"message\": \"搜索失败: ${error?.message}\"}"
} }
// 恢复协程执行 // 恢复协程执行
continuation.resume(result) continuation.resume(result)
} }

Loading…
Cancel
Save