diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 7d244c60a..441e2cafc 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -29,9 +29,9 @@
-
+
diff --git a/lib/data/models/appconfig.dart b/lib/data/models/appconfig.dart
index 22a09d84a..1d1b844ab 100644
--- a/lib/data/models/appconfig.dart
+++ b/lib/data/models/appconfig.dart
@@ -42,6 +42,11 @@ class AppConfig {
return names;
}
+ static List allproductUuids() {
+ List uuids = config.products.map((user) => user.scanuuid).toList();
+ return uuids;
+ }
+
static DBProduct? getproduct(String name) {
final foundProduct =
config.products.firstWhere((product) => product.devicename == name);
diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart
index b9f48be6e..5d1af6ca3 100644
--- a/lib/data/services/ble_manager.dart
+++ b/lib/data/services/ble_manager.dart
@@ -532,7 +532,7 @@ class BleManager extends GetxService {
try {
// 从.env文件直接读取环境变量
var serverurl = dotenv.env['SERVER_URL'] ?? '';
- if (Get.locale?.countryCode != 'CN') {
+ if (Get.deviceLocale?.countryCode != 'CN') {
serverurl = dotenv.env['HW_SERVER_URL'] ?? '';
}
@@ -833,9 +833,9 @@ class BleManager extends GetxService {
}
/// 验证设备是否可以配对
- Future startScan(String devicename) async {
+ Future startScan(List uuids) async {
try {
- await _bleService.startScan(devicename);
+ await _bleService.startScan(uuids);
} catch (e) {
Logger.error('开始扫描设备: ${e.toString()}');
}
@@ -860,9 +860,9 @@ class BleManager extends GetxService {
}
}
- Future>?> getDeviceList(String deviceName) async {
+ Future>?> getDeviceList(String devicename) async {
try {
- final result = _bleService.getDeviceList(deviceName);
+ final result = _bleService.getDeviceList(devicename);
return result;
} catch (e) {
Logger.error('获取设备信息: ${e.toString()}');
diff --git a/lib/data/services/speech_impl/azure_tts_service.dart b/lib/data/services/speech_impl/azure_tts_service.dart
index 630e7b98c..369e0ca31 100644
--- a/lib/data/services/speech_impl/azure_tts_service.dart
+++ b/lib/data/services/speech_impl/azure_tts_service.dart
@@ -37,7 +37,7 @@ class AzureTtsService extends GetxService implements TtsService {
// 可观察状态
final isEnabled = true.obs;
final _isSpeaking = false.obs;
-
+ String _currsessionid = '';
// 流式文本缓冲区
String _streamBuffer = '';
@@ -183,13 +183,32 @@ class AzureTtsService extends GetxService implements TtsService {
}
@override
- Future speakOnce(String text) async {
+ Future startspeak(String sessionid) async {
+ if (!_isInitialized) await initialize();
+ if (!isEnabled.value) return false;
+
+ try {
+ // 开始合成,传递参数
+ final result = await _channel.invokeMethod('startspeak', {
+ 'sessionid': sessionid,
+ });
+
+ return result == true;
+ } catch (e) {
+ Logger.error('语音合成失败: ${e.toString()}');
+ return false;
+ }
+ }
+
+ @override
+ Future speakOnce(String sessionid, String text) async {
if (!_isInitialized) await initialize();
if (!isEnabled.value || text.isEmpty) return false;
try {
// 开始合成,传递参数
final result = await _channel.invokeMethod('speakText', {
+ 'sessionid': sessionid,
'text': text,
});
@@ -201,7 +220,7 @@ class AzureTtsService extends GetxService implements TtsService {
}
@override
- Future speakStream(String text) async {
+ Future speakStream(String sessionid, String text) async {
if (!isEnabled.value || text.isEmpty) return false;
try {
@@ -256,12 +275,12 @@ class AzureTtsService extends GetxService implements TtsService {
}
@override
- Future flushStream() async {
+ Future flushStream(String sessionid) async {
if (_textQueue.isEmpty && _streamBuffer.isEmpty) return true;
try {
// 处理缓冲区中可能的完整句子
- await speakStream('');
+ await speakStream(sessionid, '');
// 如果缓冲区仍有剩余文本,将其添加到播放队列
if (_streamBuffer.isNotEmpty && _streamBuffer.trim().isNotEmpty) {
@@ -345,7 +364,7 @@ class AzureTtsService extends GetxService implements TtsService {
final text = _textQueue.first;
// 开始合成
- final success = await speakOnce(text);
+ final success = await speakOnce(_currsessionid, text);
// 仅当合成操作失败时才从队列移除并继续处理下一项
// 成功的话会等待合成完成事件后自动处理下一项
diff --git a/lib/data/services/speech_impl/voice_clone_tts_service.dart b/lib/data/services/speech_impl/voice_clone_tts_service.dart
index 4fa6514ed..a779270c4 100644
--- a/lib/data/services/speech_impl/voice_clone_tts_service.dart
+++ b/lib/data/services/speech_impl/voice_clone_tts_service.dart
@@ -27,6 +27,7 @@ class VoiceCloneTtsService extends GetxService implements TtsService {
late ConcatenatingAudioSource _playlist;
// 当前语音
+ String _currsessionid = '';
final RxString _currentVoice = ''.obs;
@override
@@ -215,7 +216,21 @@ class VoiceCloneTtsService extends GetxService implements TtsService {
}
@override
- Future speakOnce(String text) async {
+ Future startspeak(String sessionid) async {
+ if (!_isInitialized) await initialize();
+ if (!isEnabled.value) return false;
+
+ try {
+ _currsessionid = sessionid;
+ return true;
+ } catch (e) {
+ Logger.error('语音合成失败: ${e.toString()}');
+ return false;
+ }
+ }
+
+ @override
+ Future speakOnce(String sessionid, String text) async {
if (!isEnabled.value || text.isEmpty) return false;
try {
@@ -236,7 +251,7 @@ class VoiceCloneTtsService extends GetxService implements TtsService {
}
@override
- Future speakStream(String text) async {
+ Future speakStream(String sessionid, String text) async {
if (!isEnabled.value || text.isEmpty) return false;
try {
@@ -295,12 +310,14 @@ class VoiceCloneTtsService extends GetxService implements TtsService {
}
@override
- Future flushStream() async {
+ Future flushStream(
+ String sessionid,
+ ) async {
if (_textQueue.isEmpty && _streamBuffer.isEmpty) return true;
try {
// 处理缓冲区中可能的完整句子
- await speakStream('');
+ await speakStream(sessionid, '');
// 如果缓冲区仍有剩余文本,将其添加到播放队列
if (_streamBuffer.isNotEmpty && _streamBuffer.trim().isNotEmpty) {
@@ -344,7 +361,7 @@ class VoiceCloneTtsService extends GetxService implements TtsService {
final item = _textQueue.removeAt(0);
// 使用speakOnce播放当前项
- await speakOnce(item);
+ await speakOnce(_currsessionid, item);
}
} catch (e) {
Logger.error('处理语音队列出错: ${e.toString()}');
diff --git a/lib/data/services/speech_impl/volcano_tts_service.dart b/lib/data/services/speech_impl/volcano_tts_service.dart
index f84ed6b0a..b2bdcc2a1 100644
--- a/lib/data/services/speech_impl/volcano_tts_service.dart
+++ b/lib/data/services/speech_impl/volcano_tts_service.dart
@@ -206,7 +206,26 @@ class VolcanoTtsService extends GetxService implements TtsService {
}
@override
- Future speakOnce(String text) async {
+ Future startspeak(String sessionid) async {
+ if (!await _ensureInitialized()) return false;
+
+ try {
+ // 单次播放
+ final result = await _channel.invokeMethod('startspeak', {
+ 'sessionid': sessionid,
+ }) ??
+ false;
+
+ return result;
+ } catch (e) {
+ debugPrint('单次播放失败:$e');
+ _eventStreamController.add(TtsEvent.error('单次播放失败:$e'));
+ return false;
+ }
+ }
+
+ @override
+ Future speakOnce(String sessionid, String text) async {
if (!await _ensureInitialized()) return false;
try {
@@ -225,7 +244,7 @@ class VolcanoTtsService extends GetxService implements TtsService {
}
@override
- Future speakStream(String text) async {
+ Future speakStream(String sessionid, String text) async {
if (!await _ensureInitialized()) return false;
try {
@@ -244,7 +263,9 @@ class VolcanoTtsService extends GetxService implements TtsService {
}
@override
- Future flushStream() async {
+ Future flushStream(
+ String sessionid,
+ ) async {
if (!await _ensureInitialized()) return false;
try {
diff --git a/lib/data/services/tts_service.dart b/lib/data/services/tts_service.dart
index 996437def..f36827699 100644
--- a/lib/data/services/tts_service.dart
+++ b/lib/data/services/tts_service.dart
@@ -19,14 +19,17 @@ abstract class TtsService {
/// 设置语音
Future setVoice(String voiceName);
+ ///开始新的播放会话
+ Future startspeak(String sessionid);
+
/// 单次播放文本,完成后返回
- Future speakOnce(String text);
+ Future speakOnce(String sessionid, String text);
/// 将文本加入播放队列,支持连续播放多段文本
- Future speakStream(String text);
+ Future speakStream(String sessionid, String text);
/// 播放队列中剩余文本
- Future flushStream();
+ Future flushStream(String sessionid);
/// 停止播放
Future stop();
diff --git a/lib/data/services/version_update_service.dart b/lib/data/services/version_update_service.dart
index e959227ce..a15251857 100644
--- a/lib/data/services/version_update_service.dart
+++ b/lib/data/services/version_update_service.dart
@@ -30,7 +30,9 @@ class VersionUpdateService extends GetxService {
static final String? _countryCode = Get.deviceLocale?.countryCode; //国家地区编码
static final String? _languageCode = Get.deviceLocale?.languageCode; //语言编码
// ignore: non_constant_identifier_names
- static final String? _SERVER_URL = dotenv.env['SERVER_URL']; //服务器地址
+ static final String? _SERVER_URL = (_countryCode == 'CN')
+ ? dotenv.env['SERVER_URL']
+ : dotenv.env['HW_SERVER_URL']; //服务器地址
// 添加 getter 方法来访问缓存的静态数据
/// 获取缓存的应用版本
diff --git a/lib/modules/FTFTranslation/controllers/FTFTranslation_controller.dart b/lib/modules/FTFTranslation/controllers/FTFTranslation_controller.dart
index 8b72d435e..9e55b7d18 100644
--- a/lib/modules/FTFTranslation/controllers/FTFTranslation_controller.dart
+++ b/lib/modules/FTFTranslation/controllers/FTFTranslation_controller.dart
@@ -42,7 +42,7 @@ class FTFTranslationController extends GetxController
final sourceLanguageCode = 'zh-CN'.obs;
final targetLanguageCode = 'en-US'.obs;
final isTtsEnabled = true.obs;
-
+ var _currsessionid = '';
@override
void onInit() {
super.onInit();
@@ -168,7 +168,7 @@ class FTFTranslationController extends GetxController
'en-US-AriaNeural';
await _ttsService.setVoice(voiceName);
- await _ttsService.speakOnce(text);
+ await _ttsService.speakOnce(_currsessionid, text);
} catch (e) {
Logger.error('播放翻译失败: ${e.toString()}');
}
diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart
index fd7dc00e4..631f1c78d 100644
--- a/lib/modules/agent/controllers/agent_controller.dart
+++ b/lib/modules/agent/controllers/agent_controller.dart
@@ -318,8 +318,8 @@ class AgentController extends GetxController {
// 更新分页状态
currentPage.value = 1;
hasMoreMessages.value = result.totalPages > 1;
- print(
- 'liwei-------------读取历史记录 ${AppDir.value}${historyMessages[0].imagePath}');
+ // print(
+ // 'liwei-------------读取历史记录 ${AppDir.value}${historyMessages[0].imagePath}');
Logger.i(TAG,
'成功加载 ${historyMessages.length} 条聊天记录,总页数: ${result.totalPages}');
_logMessageDetails(historyMessages);
@@ -800,12 +800,14 @@ class AgentController extends GetxController {
["card_navigation"]["start"] as String;
final end = metaResult["maps_route_navigation"]
["card_navigation"]["end"] as String;
- // Logger.i(TAG, 'liwei-------- 打开导航页面: $start $end ');
- Future.delayed(Duration(seconds: 2), () {
- // Logger.i(TAG, 'liwei-------- 打开导航页面: $start $end ');
- // 2秒后执行的代码
- openNavigation(start, end, "");
- });
+ final items = metaResult['items'];
+ if (items != null) {
+ Future.delayed(Duration(seconds: 2), () {
+ // Logger.i(TAG, 'liwei-------- 打开导航页面: $start $end ');
+ // 2秒后执行的代码
+ openNavigation(start, end, "");
+ });
+ }
}
}
}
@@ -949,10 +951,6 @@ class AgentController extends GetxController {
final text = textController.text.trim();
if (text.isEmpty) return;
- final message = Message(isUser: true, text: text);
- messages.add(message);
- textController.clear();
-
// 使用reverse:true时通常不需要手动滚动
// 3. 调用AI服务处理
try {
@@ -963,6 +961,9 @@ class AgentController extends GetxController {
// 根据TTS状态决定是否朗读
await AgentService.processTextInput(text,
speakResponse: isTtsEnabled.value);
+ final message = Message(isUser: true, text: text);
+ messages.add(message);
+ textController.clear();
} catch (e) {
Logger.e(TAG, '发送文本消息失败: $e');
isProcessing.value = false;
@@ -1597,7 +1598,7 @@ class AgentController extends GetxController {
isPushToTalkActive.value = true;
//await AgentService.recognizeCallback();
// 开始语音识别
- await AgentService.startConversation(mode: 'push_to_talk');
+ AgentService.startConversation(mode: 'push_to_talk');
// await startVoiceInput();
}
@@ -1611,7 +1612,7 @@ class AgentController extends GetxController {
// 清除按住说话状态(但保持按住说话模式)
isPushToTalkActive.value = false;
- await AgentService.stopConversation();
+ AgentService.stopConversation();
// 停止语音识别
// await stopVoiceInput();
}
diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart
index 7ed4c0ddd..054a37ca0 100644
--- a/lib/modules/agent/views/agent_view.dart
+++ b/lib/modules/agent/views/agent_view.dart
@@ -4,6 +4,7 @@ import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_intro/flutter_intro.dart';
import 'package:get/get.dart';
+import 'package:haptic_feedback/haptic_feedback.dart';
import '../../../core/widgets/intro_overlay_builder.dart';
import '../controllers/agent_controller.dart';
import '../controllers/message_action_controller.dart';
@@ -616,6 +617,7 @@ class _AgentViewState extends State with WidgetsBindingObserver {
_holdTimer = Timer(
const Duration(milliseconds: 100),
() {
+ Haptics.vibrate(HapticsType.success);
controller.startPushToTalk();
// if (activeSpeaker == 0) {
// if (speakerId == 1) {
diff --git a/lib/modules/agent/views/message_bubble.dart b/lib/modules/agent/views/message_bubble.dart
index c26503de6..d4120a931 100644
--- a/lib/modules/agent/views/message_bubble.dart
+++ b/lib/modules/agent/views/message_bubble.dart
@@ -296,20 +296,22 @@ class MessageBubble extends GetView {
final start = card_navigation['start'] as String? ?? '';
final end = card_navigation['end'] as String? ?? '';
final destination = card_navigation['destination'] as String? ?? '';
- final rawList = card_navigation['items'] as List? ?? [];
- final list =
- rawList.map((e) => Map.from(e)).toList();
- final rawNavigation = card_navigation['navigation'];
- final Map? navigation =
- rawNavigation is Map ? rawNavigation : null;
- print("导航实时数据 ${rawNavigation}");
- // 导航
- return navigationCard(context,
- start: start,
- end: end,
- destination: destination,
- modes: list,
- navigation: navigation);
+ final rawList = card_navigation['items'] as List? ?? null;
+ if (rawList != null) {
+ final list =
+ rawList.map((e) => Map.from(e)).toList();
+ final rawNavigation = card_navigation['navigation'];
+ final Map? navigation =
+ rawNavigation is Map ? rawNavigation : null;
+ // print("导航实时数据 ${rawNavigation}");
+ // 导航
+ return navigationCard(context,
+ start: start,
+ end: end,
+ destination: destination,
+ modes: list,
+ navigation: navigation);
+ }
}
}
diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart
index c3fa87398..d3a95129e 100644
--- a/lib/modules/home/controllers/home_controller.dart
+++ b/lib/modules/home/controllers/home_controller.dart
@@ -1,4 +1,3 @@
-
import 'package:get/get.dart';
import 'dart:async';
import '../../../data/services/novice_guide_service.dart';
@@ -69,7 +68,7 @@ class HomeController extends GetxController {
super.onInit();
_otaCheckService = Get.find();
_initWithCachedInfo();
- _startBatteryRefreshTimer(); // 启动电池信息定时刷新
+ // _startBatteryRefreshTimer(); // 启动电池信息定时刷新
}
@override
@@ -158,12 +157,12 @@ class HomeController extends GetxController {
});
}
// 根据连接状态控制定时器
- if (isNowConnected) {
- _startBatteryRefreshTimer(); // 连接时启动定时器
- } else {
- _stopBatteryRefreshTimer(); // 断开时停止定时器
- // 注意:不再重置OTA检查状态,因为现在由全局服务管理
- }
+ // if (isNowConnected) {
+ // _startBatteryRefreshTimer(); // 连接时启动定时器
+ // } else {
+ // _stopBatteryRefreshTimer(); // 断开时停止定时器
+ // // 注意:不再重置OTA检查状态,因为现在由全局服务管理
+ // }
}
update();
@@ -351,7 +350,8 @@ class HomeController extends GetxController {
Logger.d(_tag, 'OTA检查状态: $status');
// 使用全局OTA检查服务执行检查
- final success = await _otaCheckService.performOtaCheck(_isFullyConnected.value);
+ final success =
+ await _otaCheckService.performOtaCheck(_isFullyConnected.value);
if (success) {
Logger.d(_tag, 'OTA检查已成功执行');
@@ -365,6 +365,4 @@ class HomeController extends GetxController {
Map getOtaCheckStatus() {
return _otaCheckService.getCheckStatus();
}
-
-
}
diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart
index f2783f4bb..feddfb18e 100644
--- a/lib/modules/pairing/controllers/pairing_controller.dart
+++ b/lib/modules/pairing/controllers/pairing_controller.dart
@@ -735,6 +735,7 @@ class PairingController extends GetxController with WidgetsBindingObserver {
}
final currentBleState = await _bleManager.getConnectionState();
final names = AppConfig.allproductNames();
+ final uuids = AppConfig.allproductUuids();
// 检查是否已有绑定的设备
print("device.address${device.address}");
if (User.instance.devices.isNotEmpty) {
@@ -791,13 +792,13 @@ class PairingController extends GetxController with WidgetsBindingObserver {
}
}
print(
- '获取到 deviceName: $deviceName address: ${device.address} names:$names');
+ '获取到 deviceName: $deviceName address: ${device.address} uuids:$uuids');
if (names.contains(deviceName)) {
if (currentBleState == 2) {
//已连接直接返回
return 9;
}
- await _bleManager.startScan(deviceName);
+ await _bleManager.startScan(uuids);
await Future.delayed(const Duration(seconds: 1));
// 尝试最多读取 3 次设备信息,每次间隔 1 秒
List