diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 99c5f58ed..4cde8e5c9 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -88,6 +88,9 @@
fb-messenger-share-api
fbauth2
fbshareextension
+ google.navigation
+ googlemaps
+ comgooglemaps
LSRequiresIPhoneOS
diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart
index 631f1c78d..7aa64b141 100644
--- a/lib/modules/agent/controllers/agent_controller.dart
+++ b/lib/modules/agent/controllers/agent_controller.dart
@@ -3,6 +3,8 @@ import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import 'package:amap_service/amap_service.dart';
+import 'package:http/http.dart' as http;
+import 'package:url_launcher/url_launcher.dart';
import 'package:voitrans/data/models/song_model.dart';
import 'package:voitrans/data/services/ble_manager.dart';
import 'package:voitrans/data/services/bluetooth_manager.dart';
@@ -800,7 +802,8 @@ class AgentController extends GetxController {
["card_navigation"]["start"] as String;
final end = metaResult["maps_route_navigation"]
["card_navigation"]["end"] as String;
- final items = metaResult['items'];
+ final items = metaResult["maps_route_navigation"]
+ ["card_navigation"]['items'];
if (items != null) {
Future.delayed(Duration(seconds: 2), () {
// Logger.i(TAG, 'liwei-------- 打开导航页面: $start $end ');
@@ -808,6 +811,26 @@ class AgentController extends GetxController {
openNavigation(start, end, "");
});
}
+ } else if (metaResult
+ .containsKey("maps_google_route_navigation")) {
+ //导航
+ final maps_google_route_navigation_raw =
+ metaResult["maps_google_route_navigation"];
+
+ // 安全的类型检查
+ if (maps_google_route_navigation_raw is Map) {
+ final maps_google_route_navigation =
+ maps_google_route_navigation_raw;
+ final data = maps_google_route_navigation["data"];
+ if (data != null) {
+ final end = data["destination"] as String;
+ final mode = data["items"][0]["ntype"] as String;
+ Future.delayed(Duration(seconds: 1), () {
+ // Logger.i(TAG, 'liwei-------- 打开google地图: $end ');
+ openGoogleMap(end, mode);
+ });
+ }
+ }
}
}
}
@@ -2146,4 +2169,29 @@ class AgentController extends GetxController {
print('播放控制失败: $e');
}
}
+
+ /// 打开Google地图进行导航
+ Future openGoogleMap(String daddr, String mode) async {
+ try {
+ // 方案1: 尝试使用Google Maps应用的URL scheme
+ // final Uri googleMapsUri = Uri.parse(url);
+
+ // 方案1: Google Maps应用 URL scheme
+ final Uri appUri = Uri.parse(
+ 'comgooglemaps://?saddr=CurrentLocation&daddr=$daddr&directionsmode=$mode');
+ if (await canLaunchUrl(appUri)) {
+ await launchUrl(appUri, mode: LaunchMode.externalApplication);
+ return;
+ } else {
+ final Uri webUrl = Uri.parse(
+ "https://www.google.com/maps/dir/?api=1&origin=Current+Location&destination=$daddr&travelmode=$mode");
+ if (await canLaunchUrl(webUrl)) {
+ await launchUrl(webUrl);
+ }
+ }
+ } catch (e) {
+ print('打开地图失败: $e');
+ Get.snackbar('错误', '打开地图时发生错误');
+ }
+ }
}
diff --git a/lib/modules/agent/views/google_navigation_card.dart b/lib/modules/agent/views/google_navigation_card.dart
new file mode 100644
index 000000000..177d68324
--- /dev/null
+++ b/lib/modules/agent/views/google_navigation_card.dart
@@ -0,0 +1,447 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import '../controllers/agent_controller.dart';
+
+String formatDistance(String distanceStr) {
+ final distance = double.tryParse(distanceStr);
+ if (distance == null) return distanceStr; // 如果无法解析,则返回原始字符串
+
+ if (distance >= 1000) {
+ final km = distance / 1000;
+ return '${km.toStringAsFixed(1)} KM';
+ } else {
+ return '${distance.toStringAsFixed(0)} M';
+ }
+}
+
+String formatDuration(String secondsStr) {
+ int totalSeconds = int.tryParse(secondsStr) ?? 0;
+ Duration duration = Duration(seconds: totalSeconds);
+
+ int hours = duration.inHours;
+ int minutes = duration.inMinutes.remainder(60);
+ int seconds = duration.inSeconds.remainder(60);
+
+ List parts = [];
+ if (hours > 0) parts.add('$hours${'hours'.tr}'); // 小时
+ if (minutes > 0) parts.add('$minutes${'minutes'.tr}'); // 分钟
+ //不需要秒
+ //if (seconds > 0 || parts.isEmpty) parts.add('$seconds${'seconds'.tr}'); // 秒
+
+ return parts.join('');
+}
+
+/// 导航卡片组件
+///
+/// 各元素含义分析:
+/// - [start]: 起点坐标 (经纬度格式)
+/// - [end]: 终点坐标 (经纬度格式)
+/// - [destination]: 目的地名称显示
+/// - [modes]: 导航方式列表,包含驾车、步行、公交等选项
+/// - [navigation]: 当前导航状态信息(可选)
+/// - [height]: 卡片高度
+Widget googlenavigationCard(
+ BuildContext context, {
+ required String start,
+ required String end,
+ required String destination,
+ required List