diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index b1593f6c2..1d7df2f6e 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -207,7 +207,6 @@ class BleManager extends GetxService { final _isConnected = false.obs; bool get isConnected => _isConnected.value; bool get isCall => _isCall.value; - // 设备信息缓存 final deviceInfo = Rx(null); // 使用 Rx 包装 diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index b124cdbef..57cb8c19a 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:amap_service/amap_service.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:uuid/uuid.dart'; @@ -13,7 +14,6 @@ import '/data/services/bluetooth_manager.dart'; import '/data/services/qq_music.dart'; import 'package:flutter_intro/flutter_intro.dart'; import '../../../data/services/novice_guide_service.dart'; -import '../../../routes/app_routes.dart'; import '/core/utils/upload_oss.dart'; import '/data/models/user_Info.dart'; import '/data/services/music_manager.dart'; @@ -144,6 +144,8 @@ class AgentController extends GetxController with WidgetsBindingObserver { // 会话ID final String agentId = 'default_agent'; + var musicServiceType = 'WY'; + // 分页加载相关状态 final isLoadingMore = false.obs; // 是否正在加载更多消息 final hasMoreMessages = true.obs; // 是否还有更多消息 @@ -167,6 +169,10 @@ class AgentController extends GetxController with WidgetsBindingObserver { @override void onInit() { super.onInit(); + musicServiceType = AppConfig.env('APP_ANDROID_MUSICSERVICE_TYPE') ?? 'AUTO'; + if (Platform.isIOS) { + musicServiceType = AppConfig.env('APP_IOS_MUSICSERVICE_TYPE') ?? 'AUTO'; + } vipExpiryTime.value = User.isLoggedIn() ? User.instance.vipexptime : 0; ever(User.refreshTick, (_) { vipExpiryTime.value = User.instance.vipexptime; @@ -1023,8 +1029,12 @@ class AgentController extends GetxController with WidgetsBindingObserver { } if (function_name.contains("music")) { Future.delayed(Duration(seconds: 1), () { - _qqmusicManager.syncCurrentPlayInfo(isOpenPlay: false); - musicStatus(); + Logger.i(TAG, '音乐服务 $musicServiceType'); + if (musicServiceType == "QQ") { + _qqmusicManager.syncCurrentPlayInfo(isOpenPlay: false); + } else { + musicStatus(); + } }); // } } 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 7c7bb967c..ed99d8a76 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 @@ -13,6 +13,7 @@ import com.yunqiinnovation.chat_api.ChatApiService import com.yunqiinnovation.chat_api.StreamCallback import com.yunqiinnovation.chat_storage.ChatStorageHelper import com.yunqiinnovation.music_service.MusicSingleton +import com.yunqiinnovation.music_service.MusicService import com.yunqiinnovation.amap_service.NavigationServiceHelper import com.yunqiinnovation.user_portrait.UserPortrait import com.yunqiinnovation.location_service.LocationService @@ -160,6 +161,7 @@ object AgentService : CoroutineScope { var audioSourceType = AzureAsrHelper.AudioSourceType.MICROPHONE var navigationMode = "" + var musicServiceType = "" // 语气词过滤列表(中英文) private val FILLER_WORDS = setOf( // 中文语气词 @@ -270,7 +272,8 @@ object AgentService : CoroutineScope { // 初始化TTS服务 initializeTtsEngine(config) - navigationMode = config["navigationMode"]?.toString() ?: "" + navigationMode = config["navigationMode"]?.toString() ?: "" + musicServiceType = config["musicServiceType"]?.toString() ?: "" // 初始化ChatAPI服务 chatApiService.initialize( config["openaiApiKey"]?.toString() ?: "", @@ -415,11 +418,12 @@ object AgentService : CoroutineScope { } context.sendBroadcast(intent) Log.e(TAG, "QQ 音乐暂停播放") - QQMusicSingleton.getInstance().autopauseMusic { result -> - if (result.isSuccess) { - isplaymusic = true - } - } + autopauseMusic() + // QQMusicSingleton.getInstance().autopauseMusic { result -> + // if (result.isSuccess) { + // isplaymusic = true + // } + // } } TtsEventType.PLAYBACK_COMPLETED -> { //结束AI播报内容 @@ -434,11 +438,12 @@ object AgentService : CoroutineScope { if(currentRecognitionMode == "ble_wakeup"&&_isInterrupt.get()){ BleService.openB1Encoder() } - if(isplaymusic){ - isplaymusic = false - Log.e(TAG, "QQ 音乐恢复播放") - QQMusicSingleton.getInstance().resumeMusic { } - } + resumeMusic() + // if(isplaymusic){ + // isplaymusic = false + // Log.e(TAG, "QQ 音乐恢复播放") + // QQMusicSingleton.getInstance().resumeMusic { } + // } } TtsEventType.ERROR -> { @@ -919,6 +924,7 @@ object AgentService : CoroutineScope { } } + /** * 处理文本输入 */ @@ -2729,4 +2735,34 @@ object AgentService : CoroutineScope { Log.e(TAG, "保存 _isInterrupt 缓存状态时发生异常: ${e.message}", e) } } + + /* + * 自动暂停音乐 + */ + private fun autopauseMusic(){ + if ( musicServiceType == "QQ" ){ + QQMusicSingleton.getInstance().autopauseMusic { result -> + if (result.isSuccess) { + isplaymusic = true + } + } + }else{ + if (MusicService.isPlaying()){ + MusicSingleton.startServiceWithCommand(context, "pause") + isplaymusic = true + } + } + } + + private fun resumeMusic() { + if ( isplaymusic ){ + Log.d(TAG, "音乐恢复 : $musicServiceType") + isplaymusic = false + if ( musicServiceType == "QQ" ){ + QQMusicSingleton.getInstance().resumeMusic {} + }else{ + MusicSingleton.startServiceWithCommand(context, "resume") + } + } + } } diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/MCPClient.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/MCPClient.kt index 17d4c3f87..fd2409d20 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/MCPClient.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/MCPClient.kt @@ -54,6 +54,7 @@ class MCPClient(private val context: Context? = null,musicType: String = "AUTO") init { initializeSystemFunctions() + Log.d(TAG, "初始化音乐服务: $musicType") when (musicType) { "WY" -> initializeMusiceFunctions() //网易 "QQ" -> initializeQQMusiceFunctions() //QQ diff --git a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift index 58a940cc1..dece8d55f 100644 --- a/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift +++ b/local_plugins/chat_api/ios/chat_api/Sources/chat_api/ChatApiService.swift @@ -96,6 +96,7 @@ public class ChatApiService: NSObject { /// 初始化ChatAPI服务 public func initialize(apiKey: String, baseUrl: String, model: String, visionModel:String, mcpServer: String,musicServiceType:String) -> Bool { + print("[ChatApiService] 初始化 ChatAPI 服务 musicServiceType: \(musicServiceType)") self.apiKey = apiKey if !baseUrl.isEmpty { self.baseUrl = baseUrl