From 91fa673a1833a8f8f0dd8ce497efa77280b87e12 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 12 Jan 2026 15:10:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(home):=20=E6=B7=BB=E5=8A=A0=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E6=A8=A1=E5=9D=97=E5=94=A4=E9=86=92=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在进入会议页面前关闭设备唤醒功能,返回时根据录音状态决定是否重新开启 修改翻译模块唤醒控制以保持一致性 --- .../home/controllers/home_controller.dart | 45 +++++++++++++++++-- lib/modules/home/views/home_view.dart | 3 +- .../agent_service/AgentServicePlugin.kt | 15 +++++++ .../yunqiinnovation/agent_service/BleAgent.kt | 25 ++++++++--- .../agent_service/lib/agent_service.dart | 22 ++++++--- 5 files changed, 94 insertions(+), 16 deletions(-) diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart index 7c1dddbc5..6073ecdcb 100644 --- a/lib/modules/home/controllers/home_controller.dart +++ b/lib/modules/home/controllers/home_controller.dart @@ -11,6 +11,7 @@ import '../../../data/services/ble_manager.dart'; import '../../../data/services/ota_check_service.dart'; import '../../../data/models/appconfig.dart'; import '../../../data/models/appconfig_model.dart'; +import '../../meeting/controllers/meeting_record_controller.dart'; /// 连接状态枚举 enum ConnectionStatus { @@ -118,6 +119,7 @@ class HomeController extends GetxController { // 中文注释:忽略异常,保持现有状态,避免因类型转换失败导致崩溃 } }); + // 移除了电池信息定时刷新的启动 } @@ -239,13 +241,50 @@ class HomeController extends GetxController { Get.toNamed(Routes.pairing); } - void openTranslation() { - AgentService.stopAiSteam(); - Get.toNamed(Routes.translationMiddleware); + void openTranslation() async { + AgentService.interruptCurrentResponse(); + AgentService.setCanWakeUp(false); + Logger.d(_tag, 'liwei-----------关闭唤醒功能'); + await Get.toNamed(Routes.translationMiddleware); + AgentService.setCanWakeUp(true); + Logger.d(_tag, 'liwei-----------打开唤醒功能'); + } + + /// 打开会议模块 + /// 参数:无 + /// 返回值:`Future` 无返回数据 + /// 异常:不显式抛出;内部仅记录日志 + /// 说明:进入会议页前关闭唤醒;返回首页后根据录音状态决定是否开启唤醒(存在录音任务则不启用) + void openMeet() async { + AgentService.interruptCurrentResponse(); + AgentService.setCanWakeUp(false); + Logger.d(_tag, 'liwei-----------关闭唤醒功能'); + await Get.toNamed(Routes.meeting); + try { + if (Get.isRegistered()) { + final mrc = Get.find(); + final hasRecording = mrc.isRecording.value || + mrc.timerStatus.value != TimerStatus.stopped; + if (hasRecording) { + AgentService.setCanWakeUp(false); + Logger.d(_tag, 'openMeet返回:检测到录音任务,保持关闭唤醒功能'); + } else { + AgentService.setCanWakeUp(true); + Logger.d(_tag, 'openMeet返回:无录音任务,打开唤醒功能'); + } + } else { + AgentService.setCanWakeUp(true); + Logger.d(_tag, 'openMeet返回:未注册MeetingRecordController,默认打开唤醒功能'); + } + } catch (e) { + AgentService.setCanWakeUp(true); + Logger.e(_tag, 'openMeet返回:检测录音任务异常,默认打开唤醒功能: $e'); + } } void exploreAIFeatures() { Get.toNamed(Routes.agent); + AgentService.interruptCurrentResponse(); } Future _checkConnectionStatus() async { diff --git a/lib/modules/home/views/home_view.dart b/lib/modules/home/views/home_view.dart index 04c3d7de0..4a12d4402 100644 --- a/lib/modules/home/views/home_view.dart +++ b/lib/modules/home/views/home_view.dart @@ -857,7 +857,8 @@ class HomeView extends GetView { ], ), onTap: () { - Get.toNamed(Routes.meeting); + // Get.toNamed(Routes.meeting); + controller.openMeet(); }, height: 85.h, // 增加高度 isDarkMode: isDarkMode, diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt index 254b63f12..4e17d7172 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt @@ -330,6 +330,21 @@ class AgentServicePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stream } } + "setCanWakeUp" -> { + try { + val canWakeUp = call.argument("canWakeUp") + if (canWakeUp == null) { + result.error("INVALID_ARGUMENTS", "canWakeUp参数不能为空", null) + return + } + BleAgent.setCanWakeUp(canWakeUp) + result.success(true) + } catch (e: Exception) { + Log.e(TAG, "设置是否可以唤醒失败", e) + result.error("SET_CAN_WAKE_UP_ERROR", "设置是否可以唤醒失败: ${e.message}", null) + } + } + "dispose" -> { try { AgentService.dispose() diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleAgent.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleAgent.kt index 3978b0cae..28712bf55 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleAgent.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleAgent.kt @@ -18,6 +18,9 @@ object BleAgent : BleService.Callback, AgentServiceListener { // 是否已注册BLE回调 private var isRegisteredToBle = false + // 是否可以唤醒 + private var isCanWakeUp = true + /** * 初始化语音代理 * @param context 上下文 @@ -57,6 +60,14 @@ object BleAgent : BleService.Callback, AgentServiceListener { } } + /** + * 设置是否可以唤醒 + */ + fun setCanWakeUp(canWakeUp: Boolean) { + Log.d(TAG, "liwei--------------设置是否可以唤醒: $canWakeUp") + isCanWakeUp = canWakeUp + } + /** * 手动启动语音识别 */ @@ -65,7 +76,7 @@ object BleAgent : BleService.Callback, AgentServiceListener { Log.e(TAG, "语音代理未初始化") return false } -Log.d(TAG, "手动启动语音识别: ") + Log.d(TAG, "手动启动语音识别: $isCanWakeUp") AgentService.interruptCurrentResponse() return AgentService.startRecognition(true, "ble_wakeup") } @@ -142,19 +153,23 @@ Log.d(TAG, "手动启动语音识别: ") * 在收到唤醒信号时启动语音识别 */ override fun onWakeupSignalReceived() { - Log.d(TAG, "收到唤醒信号,启动语音识别${AgentService.isRecognitionActive}") + Log.d(TAG, "liwei-------------- 收到唤醒信号,启动语音识别${AgentService.isRecognitionActive}") + if (!isCanWakeUp) { + Log.d(TAG, "liwei-------------- 当前不可以唤醒") + return + } // 停止当前TTS,避免冲突 AgentService.interruptCurrentResponse() // AgentService.speakText("我在!") // 启动语音识别,使用BLE唤醒模式 - // 如果已经在识别,则重新启动 - //stopListening() + // 如果已经在识别,则重新启动 + //stopListening() //stopListening() - startListening() + startListening() } override fun onDeviceInfoReceived(infoType: Int, infoData: Map) { diff --git a/local_plugins/agent_service/lib/agent_service.dart b/local_plugins/agent_service/lib/agent_service.dart index 4ba2084c3..97737c671 100644 --- a/local_plugins/agent_service/lib/agent_service.dart +++ b/local_plugins/agent_service/lib/agent_service.dart @@ -450,13 +450,9 @@ class AgentService { /// 停止语音合成和AI流输出 static Future interruptCurrentResponse() async { try { - // 首先尝试停止TTS播放 - await stopTts(); - - // 根据原生层的实现,processTextInput可以被用来中断当前的AI流输出 - // 这里我们通过发送一个特殊的空字符串来实现这一点 - // 然后立即返回true,因为我们不需要真正处理任何文本 - return true; + final bool result = + await _channel.invokeMethod('interruptCurrentResponse'); + return result; } on PlatformException catch (e) { throw AgentServiceException(e.code, e.message ?? '中断响应失败', e.details); } @@ -524,6 +520,18 @@ class AgentService { } } + /// 设置是否可以唤醒 + static Future setCanWakeUp(bool canWakeUp) async { + try { + final bool result = await _channel.invokeMethod('setCanWakeUp', { + 'canWakeUp': canWakeUp, + }); + return result; + } on PlatformException catch (e) { + throw AgentServiceException(e.code, e.message ?? '设置是否可以唤醒失败', e.details); + } + } + /// 释放资源 static Future dispose() async { try {