From 5b2e3569067a3f276dd08a96cf80db40040c9802 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Mon, 2 Feb 2026 15:33:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(translation):=20=E5=A2=9E=E5=8A=A0QQ?= =?UTF-8?q?=E9=9F=B3=E4=B9=90=E6=92=AD=E6=94=BE=E6=9A=82=E5=81=9C=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在切换翻译模式时,暂停QQ音乐播放并在退出时恢复播放,避免音频冲突 --- .../controllers/translation_controller.dart | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index d8766bd9e..b51a9a1fe 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -11,6 +11,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:pip/pip.dart'; +import 'package:voitrans/data/services/qq_music.dart'; import '../../../data/services/ast_service.dart'; import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/music_manager.dart'; @@ -54,6 +55,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { final BluetoothManager bluetoothManager = Get.find(); final BleManager bleManager = Get.find(); final _musiceManager = Get.find(); + final _qqMusicManager = Get.find(); late final UsageStatsService _usageService; // 安卓悬浮窗管理器 late final FloatingWindowManager _floatingWindowManager; @@ -79,6 +81,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { bool _audioSourceType = false; // 音频输入源类型 bool isPlayback = false; // 是否开启播放 bool isContinuePlaying = false; // 是否继续播放 + bool _isContinueQqMusicPlaying = false; // 是否继续播放QQ音乐 // 存储相关配置 static const String _sourceLanguageKey = 'translation_source_language'; @@ -330,7 +333,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver { } /// 更改翻译模式 - /// [mode] 翻译模式:simultaneous(同声传译)、audioVideo(音视频)、call(通话)、faceToFace(面对面) + /// 参数: + /// - [mode] 翻译模式:simultaneous(同声传译)、audioVideo(音视频)、call(通话)、faceToFace(面对面) + /// 返回值:无 + /// 异常:可能抛出底层服务调用异常 Future changeTranslationMode(String mode) async { currentMode.value = mode; currentModeTitle.value = _getModeTitle(mode); @@ -338,6 +344,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver { loadTranslationHistory(); //stopAll(); + if (mode == 'faceToFace' || mode == 'call' || mode == 'simultaneous') { + await suspendOtherServices(); + } + if (Platform.isAndroid && (mode == 'call' || mode == 'audioVideo')) { try { _floatingWindowManager.setLastTranslationMode(mode); @@ -741,16 +751,26 @@ class TranslationController extends GetxController with WidgetsBindingObserver { } /// 暂停其他服务(如音乐播放) + /// 参数:无 + /// 返回值:无 + /// 异常:内部捕获并记录日志,不向外抛出 Future suspendOtherServices() async { try { - var status = await _musiceManager.getStatus(); - var isPlaying = status['isPlaying'] ?? false; + if (!isContinuePlaying) { + final status = await _musiceManager.getStatus(); + final bool isPlaying = status['isPlaying'] ?? false; + if (isPlaying == true) { + isContinuePlaying = true; + await _musiceManager.pause(); + } + } - if (isPlaying == true) { - isContinuePlaying = true; - await _musiceManager.pause(); - } else { - isContinuePlaying = false; + if (!_isContinueQqMusicPlaying) { + await _qqMusicManager.syncCurrentPlayInfo(); + if (_qqMusicManager.isPlaying.value == true) { + _isContinueQqMusicPlaying = true; + await _qqMusicManager.pauseMusic(); + } } } catch (e) { Logger.error('暂停其他服务失败: ${e.toString()}'); @@ -758,11 +778,18 @@ class TranslationController extends GetxController with WidgetsBindingObserver { } /// 恢复其他服务(如音乐播放) + /// 参数:无 + /// 返回值:无 + /// 异常:内部捕获并记录日志,不向外抛出 Future restoreOtherServices() async { try { if (isContinuePlaying) await _musiceManager.resume(); + if (_isContinueQqMusicPlaying) await _qqMusicManager.resumeMusic(); } catch (e) { Logger.error('恢复其他服务失败: ${e.toString()}'); + } finally { + isContinuePlaying = false; + _isContinueQqMusicPlaying = false; } }