expo-gaode-map-navigation 2.0.12-next.0 → 2.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +296 -7
  2. package/android/build.gradle +12 -4
  3. package/android/src/main/AndroidManifest.xml +10 -1
  4. package/android/src/main/cpp/cluster_jni.cpp +56 -0
  5. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +49 -8
  6. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapOfflineModule.kt +83 -15
  7. package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapView.kt +13 -3
  8. package/android/src/main/java/expo/modules/gaodemap/map/managers/UIManager.kt +36 -39
  9. package/android/src/main/java/expo/modules/gaodemap/map/modules/SDKInitializer.kt +23 -17
  10. package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterView.kt +5 -2
  11. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapView.kt +122 -10
  12. package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapViewModule.kt +2 -2
  13. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerView.kt +37 -25
  14. package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerViewModule.kt +6 -6
  15. package/android/src/main/java/expo/modules/gaodemap/map/search/ExpoGaodeMapSearchModule.kt +751 -0
  16. package/android/src/main/java/expo/modules/gaodemap/map/utils/GeometryUtils.kt +103 -0
  17. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviView.kt +1408 -394
  18. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviViewModule.kt +121 -1
  19. package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNavigationModule.kt +14 -28
  20. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/IndependentRouteListener.kt +28 -3
  21. package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/RouteCalculateListener.kt +2 -2
  22. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/IndependentRouteManager.kt +114 -15
  23. package/android/src/main/java/expo/modules/gaodemap/navigation/routes/drive/DriveTruckRouteCalculator.kt +24 -35
  24. package/android/src/main/java/expo/modules/gaodemap/navigation/services/IndependentRouteService.kt +50 -36
  25. package/android/src/main/java/expo/modules/gaodemap/navigation/services/NavigationForegroundService.kt +661 -0
  26. package/android/src/main/java/expo/modules/gaodemap/navigation/utils/Converters.kt +21 -12
  27. package/android/src/main/res/drawable/ic_nav_notification_small.xml +10 -0
  28. package/android/src/main/res/drawable/landback_0.png +0 -0
  29. package/android/src/main/res/drawable/landback_1.png +0 -0
  30. package/android/src/main/res/drawable/landback_2.png +0 -0
  31. package/android/src/main/res/drawable/landback_3.png +0 -0
  32. package/android/src/main/res/drawable/landback_4.png +0 -0
  33. package/android/src/main/res/drawable/landback_5.png +0 -0
  34. package/android/src/main/res/drawable/landback_6.png +0 -0
  35. package/android/src/main/res/drawable/landback_7.png +0 -0
  36. package/android/src/main/res/drawable/landback_8.png +0 -0
  37. package/android/src/main/res/drawable/landback_9.png +0 -0
  38. package/android/src/main/res/drawable/landback_a.png +0 -0
  39. package/android/src/main/res/drawable/landback_b.png +0 -0
  40. package/android/src/main/res/drawable/landback_c.png +0 -0
  41. package/android/src/main/res/drawable/landback_d.png +0 -0
  42. package/android/src/main/res/drawable/landback_e.png +0 -0
  43. package/android/src/main/res/drawable/landback_f.png +0 -0
  44. package/android/src/main/res/drawable/landback_g.png +0 -0
  45. package/android/src/main/res/drawable/landback_h.png +0 -0
  46. package/android/src/main/res/drawable/landback_i.png +0 -0
  47. package/android/src/main/res/drawable/landback_j.png +0 -0
  48. package/android/src/main/res/drawable/landback_k.png +0 -0
  49. package/android/src/main/res/drawable/landback_l.png +0 -0
  50. package/android/src/main/res/drawable/landfront_0.png +0 -0
  51. package/android/src/main/res/drawable/landfront_00.png +0 -0
  52. package/android/src/main/res/drawable/landfront_1.png +0 -0
  53. package/android/src/main/res/drawable/landfront_11.png +0 -0
  54. package/android/src/main/res/drawable/landfront_20.png +0 -0
  55. package/android/src/main/res/drawable/landfront_21.png +0 -0
  56. package/android/src/main/res/drawable/landfront_22.png +0 -0
  57. package/android/src/main/res/drawable/landfront_3.png +0 -0
  58. package/android/src/main/res/drawable/landfront_33.png +0 -0
  59. package/android/src/main/res/drawable/landfront_40.png +0 -0
  60. package/android/src/main/res/drawable/landfront_43.png +0 -0
  61. package/android/src/main/res/drawable/landfront_44.png +0 -0
  62. package/android/src/main/res/drawable/landfront_5.png +0 -0
  63. package/android/src/main/res/drawable/landfront_55.png +0 -0
  64. package/android/src/main/res/drawable/landfront_61.png +0 -0
  65. package/android/src/main/res/drawable/landfront_63.png +0 -0
  66. package/android/src/main/res/drawable/landfront_66.png +0 -0
  67. package/android/src/main/res/drawable/landfront_70.png +0 -0
  68. package/android/src/main/res/drawable/landfront_71.png +0 -0
  69. package/android/src/main/res/drawable/landfront_73.png +0 -0
  70. package/android/src/main/res/drawable/landfront_77.png +0 -0
  71. package/android/src/main/res/drawable/landfront_8.png +0 -0
  72. package/android/src/main/res/drawable/landfront_88.png +0 -0
  73. package/android/src/main/res/drawable/landfront_90.png +0 -0
  74. package/android/src/main/res/drawable/landfront_95.png +0 -0
  75. package/android/src/main/res/drawable/landfront_99.png +0 -0
  76. package/android/src/main/res/drawable/landfront_a0.png +0 -0
  77. package/android/src/main/res/drawable/landfront_a8.png +0 -0
  78. package/android/src/main/res/drawable/landfront_aa.png +0 -0
  79. package/android/src/main/res/drawable/landfront_b1.png +0 -0
  80. package/android/src/main/res/drawable/landfront_b5.png +0 -0
  81. package/android/src/main/res/drawable/landfront_bb.png +0 -0
  82. package/android/src/main/res/drawable/landfront_c3.png +0 -0
  83. package/android/src/main/res/drawable/landfront_c8.png +0 -0
  84. package/android/src/main/res/drawable/landfront_cc.png +0 -0
  85. package/android/src/main/res/drawable/landfront_d.png +0 -0
  86. package/android/src/main/res/drawable/landfront_dd.png +0 -0
  87. package/android/src/main/res/drawable/landfront_e1.png +0 -0
  88. package/android/src/main/res/drawable/landfront_e5.png +0 -0
  89. package/android/src/main/res/drawable/landfront_ee.png +0 -0
  90. package/android/src/main/res/drawable/landfront_f0.png +0 -0
  91. package/android/src/main/res/drawable/landfront_f1.png +0 -0
  92. package/android/src/main/res/drawable/landfront_f5.png +0 -0
  93. package/android/src/main/res/drawable/landfront_ff.png +0 -0
  94. package/android/src/main/res/drawable/landfront_g3.png +0 -0
  95. package/android/src/main/res/drawable/landfront_g5.png +0 -0
  96. package/android/src/main/res/drawable/landfront_gg.png +0 -0
  97. package/android/src/main/res/drawable/landfront_h1.png +0 -0
  98. package/android/src/main/res/drawable/landfront_h3.png +0 -0
  99. package/android/src/main/res/drawable/landfront_h5.png +0 -0
  100. package/android/src/main/res/drawable/landfront_hh.png +0 -0
  101. package/android/src/main/res/drawable/landfront_i0.png +0 -0
  102. package/android/src/main/res/drawable/landfront_i3.png +0 -0
  103. package/android/src/main/res/drawable/landfront_i5.png +0 -0
  104. package/android/src/main/res/drawable/landfront_ii.png +0 -0
  105. package/android/src/main/res/drawable/landfront_j1.png +0 -0
  106. package/android/src/main/res/drawable/landfront_j8.png +0 -0
  107. package/android/src/main/res/drawable/landfront_jj.png +0 -0
  108. package/android/src/main/res/drawable/landfront_kk.png +0 -0
  109. package/android/src/main/res/drawable/landfront_ll.png +0 -0
  110. package/android/src/main/res/drawable/nav_notification_brand_icon.xml +16 -0
  111. package/android/src/main/res/drawable/navi_arrow_leftline.png +0 -0
  112. package/android/src/main/res/drawable/navi_lane_shape_bg_center.xml +5 -0
  113. package/android/src/main/res/drawable/navi_lane_shape_bg_left.xml +8 -0
  114. package/android/src/main/res/drawable/navi_lane_shape_bg_over.xml +6 -0
  115. package/android/src/main/res/drawable/navi_lane_shape_bg_right.xml +8 -0
  116. package/android/src/main/res/drawable-nodpi/nav_tracker_car.png +0 -0
  117. package/build/ExpoGaodeMapNaviView.d.ts +16 -0
  118. package/build/ExpoGaodeMapNaviView.d.ts.map +1 -1
  119. package/build/ExpoGaodeMapNaviView.js +74 -1
  120. package/build/ExpoGaodeMapNaviView.js.map +1 -1
  121. package/build/index.d.ts +56 -8
  122. package/build/index.d.ts.map +1 -1
  123. package/build/index.js +452 -10
  124. package/build/index.js.map +1 -1
  125. package/build/map/ExpoGaodeMapModule.d.ts +15 -13
  126. package/build/map/ExpoGaodeMapModule.d.ts.map +1 -1
  127. package/build/map/ExpoGaodeMapModule.js +31 -39
  128. package/build/map/ExpoGaodeMapModule.js.map +1 -1
  129. package/build/map/ExpoGaodeMapOfflineModule.d.ts +5 -0
  130. package/build/map/ExpoGaodeMapOfflineModule.d.ts.map +1 -1
  131. package/build/map/ExpoGaodeMapOfflineModule.js.map +1 -1
  132. package/build/map/ExpoGaodeMapView.d.ts +3 -4
  133. package/build/map/ExpoGaodeMapView.d.ts.map +1 -1
  134. package/build/map/ExpoGaodeMapView.js +28 -25
  135. package/build/map/ExpoGaodeMapView.js.map +1 -1
  136. package/build/map/components/overlays/Circle.d.ts.map +1 -1
  137. package/build/map/components/overlays/Circle.js +1 -30
  138. package/build/map/components/overlays/Circle.js.map +1 -1
  139. package/build/map/components/overlays/Cluster.d.ts.map +1 -1
  140. package/build/map/components/overlays/Cluster.js +1 -42
  141. package/build/map/components/overlays/Cluster.js.map +1 -1
  142. package/build/map/components/overlays/HeatMap.d.ts.map +1 -1
  143. package/build/map/components/overlays/HeatMap.js +21 -21
  144. package/build/map/components/overlays/HeatMap.js.map +1 -1
  145. package/build/map/components/overlays/Marker.d.ts.map +1 -1
  146. package/build/map/components/overlays/Marker.js +76 -80
  147. package/build/map/components/overlays/Marker.js.map +1 -1
  148. package/build/map/components/overlays/Polygon.d.ts.map +1 -1
  149. package/build/map/components/overlays/Polygon.js +1 -25
  150. package/build/map/components/overlays/Polygon.js.map +1 -1
  151. package/build/map/components/overlays/Polyline.d.ts.map +1 -1
  152. package/build/map/components/overlays/Polyline.js +1 -31
  153. package/build/map/components/overlays/Polyline.js.map +1 -1
  154. package/build/map/index.d.ts +9 -2
  155. package/build/map/index.d.ts.map +1 -1
  156. package/build/map/index.js +9 -2
  157. package/build/map/index.js.map +1 -1
  158. package/build/map/search/ExpoGaodeMapSearch.types.d.ts +340 -0
  159. package/build/map/search/ExpoGaodeMapSearch.types.d.ts.map +1 -0
  160. package/build/map/search/ExpoGaodeMapSearch.types.js +19 -0
  161. package/build/map/search/ExpoGaodeMapSearch.types.js.map +1 -0
  162. package/build/map/search/ExpoGaodeMapSearchModule.d.ts +74 -0
  163. package/build/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -0
  164. package/build/map/search/ExpoGaodeMapSearchModule.js +47 -0
  165. package/build/map/search/ExpoGaodeMapSearchModule.js.map +1 -0
  166. package/build/map/search/index.d.ts +156 -0
  167. package/build/map/search/index.d.ts.map +1 -0
  168. package/build/map/search/index.js +171 -0
  169. package/build/map/search/index.js.map +1 -0
  170. package/build/map/types/index.d.ts +2 -2
  171. package/build/map/types/index.d.ts.map +1 -1
  172. package/build/map/types/index.js.map +1 -1
  173. package/build/map/types/map-view.types.d.ts +4 -2
  174. package/build/map/types/map-view.types.d.ts.map +1 -1
  175. package/build/map/types/map-view.types.js.map +1 -1
  176. package/build/map/types/native-module.types.d.ts +11 -12
  177. package/build/map/types/native-module.types.d.ts.map +1 -1
  178. package/build/map/types/native-module.types.js.map +1 -1
  179. package/build/map/types/overlays.types.d.ts +9 -14
  180. package/build/map/types/overlays.types.d.ts.map +1 -1
  181. package/build/map/types/overlays.types.js.map +1 -1
  182. package/build/map/types/route-playback.types.d.ts +16 -0
  183. package/build/map/types/route-playback.types.d.ts.map +1 -1
  184. package/build/map/types/route-playback.types.js.map +1 -1
  185. package/build/map/utils/ErrorHandler.js +11 -11
  186. package/build/map/utils/ErrorHandler.js.map +1 -1
  187. package/build/map/utils/OfflineMapManager.d.ts +4 -0
  188. package/build/map/utils/OfflineMapManager.d.ts.map +1 -1
  189. package/build/map/utils/OfflineMapManager.js +6 -0
  190. package/build/map/utils/OfflineMapManager.js.map +1 -1
  191. package/build/types/coordinates.types.d.ts +3 -0
  192. package/build/types/coordinates.types.d.ts.map +1 -1
  193. package/build/types/coordinates.types.js.map +1 -1
  194. package/build/types/independent.types.d.ts +111 -12
  195. package/build/types/independent.types.d.ts.map +1 -1
  196. package/build/types/independent.types.js.map +1 -1
  197. package/build/types/native-module.types.d.ts +1 -1
  198. package/build/types/native-module.types.js.map +1 -1
  199. package/build/types/naviview.types.d.ts +304 -14
  200. package/build/types/naviview.types.d.ts.map +1 -1
  201. package/build/types/naviview.types.js.map +1 -1
  202. package/build/types/route.types.d.ts +12 -2
  203. package/build/types/route.types.d.ts.map +1 -1
  204. package/build/types/route.types.js.map +1 -1
  205. package/expo-module.config.json +4 -2
  206. package/ios/ExpoGaodeMapNaviView.swift +2331 -201
  207. package/ios/ExpoGaodeMapNaviViewModule.swift +109 -1
  208. package/ios/ExpoGaodeMapNavigation.podspec +2 -1
  209. package/ios/ExpoGaodeMapNavigationModule.swift +7 -5
  210. package/ios/managers/IndependentRouteManager.swift +90 -26
  211. package/ios/map/ExpoGaodeMapModule.swift +72 -21
  212. package/ios/map/ExpoGaodeMapOfflineModule.swift +61 -0
  213. package/ios/map/ExpoGaodeMapSearchModule.swift +773 -0
  214. package/ios/map/ExpoGaodeMapView.swift +23 -5
  215. package/ios/map/GaodeMapPrivacyManager.swift +26 -18
  216. package/ios/map/cpp/GeometryEngine.cpp +112 -0
  217. package/ios/map/cpp/GeometryEngine.hpp +21 -0
  218. package/ios/map/modules/LocationManager.swift +37 -5
  219. package/ios/map/overlays/MarkerView.swift +11 -11
  220. package/ios/map/overlays/MarkerViewModule.swift +4 -4
  221. package/ios/map/overlays/PolylineView.swift +6 -12
  222. package/ios/map/utils/ClusterNative.h +8 -0
  223. package/ios/map/utils/ClusterNative.mm +27 -0
  224. package/ios/map/utils/PermissionManager.swift +115 -6
  225. package/ios/routes/drive/DriveTruckRouteCalculator.swift +165 -77
  226. package/ios/routes/walkride/WalkRideRouteCalculator.swift +127 -1
  227. package/ios/services/IndependentRouteService.swift +198 -39
  228. package/ios/services/NavigationLiveActivityAttributes.swift +48 -0
  229. package/ios/services/NavigationLiveActivityManager.swift +359 -0
  230. package/package.json +22 -7
  231. package/plugin/build/withGaodeMap.d.ts +8 -0
  232. package/plugin/build/withGaodeMap.js +60 -4
  233. package/scripts/check-expo-modules.js +68 -0
  234. package/shared/cpp/GeometryEngine.cpp +112 -0
  235. package/shared/cpp/GeometryEngine.hpp +21 -0
  236. package/widget-template/README.md +46 -0
  237. package/widget-template/ios/NavigationLiveActivityWidget.swift +367 -0
  238. package/android/src/main/java/expo/modules/gaodemap/navigation/managers/RouteCalculator.kt +0 -173
@@ -78,19 +78,22 @@ object Converters {
78
78
  */
79
79
  fun convertNaviPathInfo(path: AMapNaviPath): Map<String, Any?> {
80
80
  return mapOf(
81
+ "naviMode" to 0,
81
82
  "currentRoadName" to "",
82
83
  "nextRoadName" to "",
83
- "currentStepRetainDistance" to 0,
84
- "currentStepRetainTime" to 0,
84
+ "curStepRetainDistance" to 0,
85
+ "curStepRetainTime" to 0,
85
86
  "pathRetainDistance" to path.allLength,
86
87
  "pathRetainTime" to path.allTime,
87
88
  "currentSpeed" to 0,
88
- "iconSpeed" to 0,
89
89
  "iconType" to 0,
90
- "cameraDistance" to 0,
91
- "cameraType" to 0,
92
- "isInHighway" to false,
93
- "isOffRoute" to false
90
+ "iconDirection" to 0,
91
+ "currentSegmentIndex" to 0,
92
+ "currentLinkIndex" to 0,
93
+ "currentPointIndex" to 0,
94
+ "routeRemainTrafficLightCount" to 0,
95
+ "driveDistance" to 0,
96
+ "driveTime" to 0
94
97
  )
95
98
  }
96
99
 
@@ -126,23 +129,28 @@ object Converters {
126
129
  /**
127
130
  * 转换路径结果(只使用确实存在的属性)
128
131
  */
129
- fun convertNaviPath(path: AMapNaviPath): Map<String, Any?> {
130
- return mapOf(
132
+ fun convertNaviPath(path: AMapNaviPath, routeId: Int? = null): Map<String, Any?> {
133
+ val payload = mutableMapOf<String, Any?>(
131
134
  "distance" to path.allLength,
132
135
  "duration" to path.allTime,
133
136
  "tollDistance" to 0,
134
137
  "tollCost" to path.tollCost,
135
- "trafficLightCount" to 0,
138
+ "trafficLightCount" to path.trafficLightCount,
136
139
  "steps" to convertSteps(path.steps),
137
140
  "polyline" to convertCoords(path.coordList)
138
141
  )
142
+ if (routeId != null) {
143
+ payload["id"] = routeId
144
+ payload["routeId"] = routeId
145
+ }
146
+ return payload
139
147
  }
140
148
 
141
149
  /**
142
150
  * 转换驾车路径结果
143
151
  */
144
152
  fun convertDriveRouteResult(paths: Map<Int, AMapNaviPath>?): Map<String, Any?> {
145
- val routes = paths?.values?.map { convertNaviPath(it) } ?: emptyList()
153
+ val routes = paths?.entries?.map { (id, path) -> convertNaviPath(path, id) } ?: emptyList()
146
154
 
147
155
  return mapOf(
148
156
  "routes" to routes,
@@ -156,11 +164,12 @@ object Converters {
156
164
  fun convertMultiRouteInfo(paths: Map<Int, AMapNaviPath>?): List<Map<String, Any?>> {
157
165
  return paths?.entries?.map { (id, path) ->
158
166
  mapOf(
167
+ "id" to id,
159
168
  "routeId" to id,
160
169
  "distance" to path.allLength,
161
170
  "duration" to path.allTime,
162
171
  "tollCost" to path.tollCost,
163
- "trafficLightCount" to 0,
172
+ "trafficLightCount" to path.trafficLightCount,
164
173
  "strategyDesc" to ""
165
174
  )
166
175
  } ?: emptyList()
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:width="24dp"
4
+ android:height="24dp"
5
+ android:viewportWidth="24"
6
+ android:viewportHeight="24">
7
+ <path
8
+ android:fillColor="#FFFFFFFF"
9
+ android:pathData="M12,2.5C8.41,2.5 5.5,5.41 5.5,9c0,4.73 6.5,12.5 6.5,12.5S18.5,13.73 18.5,9C18.5,5.41 15.59,2.5 12,2.5zM12,11.5a2.5,2.5 0,1 1,0 -5a2.5,2.5 0,0 1,0 5z" />
10
+ </vector>
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:width="96dp"
4
+ android:height="96dp"
5
+ android:viewportWidth="96"
6
+ android:viewportHeight="96">
7
+ <path
8
+ android:fillColor="#3F5BDB"
9
+ android:pathData="M48,4a44,44 0,1 0,0 88a44,44 0,1 0,0 -88z" />
10
+ <path
11
+ android:fillColor="#6E84EB"
12
+ android:pathData="M48,12a36,36 0,1 0,0 72a36,36 0,1 0,0 -72z" />
13
+ <path
14
+ android:fillColor="#FFFFFF"
15
+ android:pathData="M48,24c-10.5,0 -19,8.5 -19,19c0,14.2 19,31 19,31s19,-16.8 19,-31c0,-10.5 -8.5,-19 -19,-19zM48,50c-4.1,0 -7.5,-3.4 -7.5,-7.5c0,-4.1 3.4,-7.5 7.5,-7.5c4.1,0 7.5,3.4 7.5,7.5c0,4.1 -3.4,7.5 -7.5,7.5z" />
16
+ </vector>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape android:shape="rectangle"
3
+ xmlns:android="http://schemas.android.com/apk/res/android">
4
+ <solid android:color="#ff0091ff" />
5
+ </shape>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <corners
5
+ android:bottomLeftRadius="3dp"
6
+ android:topLeftRadius="3dp" />
7
+ <solid android:color="#ff0091ff" />
8
+ </shape>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <corners android:radius="3dp" />
5
+ <solid android:color="#ff0091ff" />
6
+ </shape>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:shape="rectangle">
4
+ <corners
5
+ android:bottomRightRadius="3dp"
6
+ android:topRightRadius="3dp" />
7
+ <solid android:color="#ff0091ff" />
8
+ </shape>
@@ -8,10 +8,26 @@ export interface ExpoGaodeMapNaviViewRef {
8
8
  * 开始导航
9
9
  */
10
10
  startNavigation: (start: Coordinates | null, end: Coordinates, type: number) => Promise<void>;
11
+ /**
12
+ * 在当前嵌入式导航视图中,使用独立路径组启动导航
13
+ *
14
+ * - 依赖当前 ExpoGaodeMapNaviView 实例
15
+ * - 适合“路线选择页 -> 进入嵌入式导航页”这类页面内流程
16
+ * - 若不依赖嵌入式导航视图,可改用模块级 startNaviWithIndependentPath(...)
17
+ */
18
+ startNavigationWithIndependentPath: (token: number, options?: {
19
+ routeId?: number;
20
+ routeIndex?: number;
21
+ naviType?: number;
22
+ }) => Promise<void>;
11
23
  /**
12
24
  * 停止导航
13
25
  */
14
26
  stopNavigation: () => Promise<void>;
27
+ /**
28
+ * 播放自定义 TTS
29
+ */
30
+ playCustomTTS: (text: string, forcePlay?: boolean) => Promise<void>;
15
31
  }
16
32
  /**
17
33
  * 高德导航视图组件
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoGaodeMapNaviView.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapNaviView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAGtE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9F;;OAEG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,oBAAoB,2GAyB/B,CAAC;AAIH,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"ExpoGaodeMapNaviView.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapNaviView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EAU1B,MAAM,SAAS,CAAC;AAuCjB;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F;;;;;;OAMG;IACH,kCAAkC,EAAE,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KACE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;OAEG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;OAEG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAuCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,oBAAoB,2GA6H/B,CAAC;AAIH,eAAe,oBAAoB,CAAC"}
@@ -1,5 +1,30 @@
1
1
  import * as React from 'react';
2
+ import { Image, PermissionsAndroid, Platform, StatusBar, } from 'react-native';
2
3
  import { createLazyNativeViewManager } from './map/utils/lazyNativeViewManager';
4
+ function normalizeNaviImageSource(source) {
5
+ if (source == null) {
6
+ return undefined;
7
+ }
8
+ if (typeof source === 'string') {
9
+ return source;
10
+ }
11
+ return Image.resolveAssetSource(source)?.uri;
12
+ }
13
+ async function ensureAndroidNavigationNotificationPermission(enabled) {
14
+ if (!enabled || Platform.OS !== 'android' || Platform.Version < 33) {
15
+ return;
16
+ }
17
+ try {
18
+ const permission = PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS;
19
+ const granted = await PermissionsAndroid.check(permission);
20
+ if (!granted) {
21
+ await PermissionsAndroid.request(permission);
22
+ }
23
+ }
24
+ catch (error) {
25
+ console.warn('[expo-gaode-map-navigation] Failed to request POST_NOTIFICATIONS permission automatically.', error);
26
+ }
27
+ }
3
28
  const getNativeView = createLazyNativeViewManager('ExpoGaodeMapNaviView');
4
29
  /**
5
30
  * 高德导航视图组件
@@ -36,7 +61,45 @@ const getNativeView = createLazyNativeViewManager('ExpoGaodeMapNaviView');
36
61
  */
37
62
  export const ExpoGaodeMapNaviView = React.forwardRef((props, ref) => {
38
63
  const nativeRef = React.useRef(null);
64
+ const hasRequestedAndroidNotificationPermissionRef = React.useRef(false);
39
65
  const NativeView = React.useMemo(() => getNativeView(), []);
66
+ const { onNaviInfoUpdate, onNaviStart, onNaviEnd, onArrive, onReCalculate, onPlayVoice, onNaviVisualStateChange, onLaneInfoUpdate, onTrafficStatusesUpdate, isNightMode, mapViewModeType, carImage, fourCornersImage, carCompassImage, startPointImage, wayPointImage, endPointImage, cameraImage, androidStatusBarPaddingTop, ...restProps } = props;
67
+ const resolvedAndroidStatusBarPaddingTop = Platform.OS === 'android' &&
68
+ androidStatusBarPaddingTop == null &&
69
+ props.showUIElements !== false &&
70
+ props.hideNativeTopInfoLayout !== true
71
+ ? (StatusBar.currentHeight ?? 0)
72
+ : androidStatusBarPaddingTop;
73
+ const resolvedCarImage = normalizeNaviImageSource(carImage);
74
+ const resolvedFourCornersImage = normalizeNaviImageSource(fourCornersImage);
75
+ const resolvedCarCompassImage = normalizeNaviImageSource(carCompassImage);
76
+ const resolvedStartPointImage = normalizeNaviImageSource(startPointImage);
77
+ const resolvedWayPointImage = normalizeNaviImageSource(wayPointImage);
78
+ const resolvedEndPointImage = normalizeNaviImageSource(endPointImage);
79
+ const resolvedCameraImage = normalizeNaviImageSource(cameraImage);
80
+ const resolvedMapViewModeType = mapViewModeType ?? (isNightMode == null ? undefined : (isNightMode ? 1 : 0));
81
+ const platformSpecificImageProps = Platform.OS === 'android'
82
+ ? {
83
+ fourCornersImage: resolvedFourCornersImage,
84
+ }
85
+ : {
86
+ carCompassImage: resolvedCarCompassImage,
87
+ cameraImage: resolvedCameraImage,
88
+ };
89
+ React.useEffect(() => {
90
+ if (Platform.OS !== 'android') {
91
+ return;
92
+ }
93
+ if (!props.androidBackgroundNavigationNotificationEnabled) {
94
+ hasRequestedAndroidNotificationPermissionRef.current = false;
95
+ return;
96
+ }
97
+ if (hasRequestedAndroidNotificationPermissionRef.current) {
98
+ return;
99
+ }
100
+ hasRequestedAndroidNotificationPermissionRef.current = true;
101
+ void ensureAndroidNavigationNotificationPermission(true);
102
+ }, [props.androidBackgroundNavigationNotificationEnabled]);
40
103
  // 创建 API 引用
41
104
  const apiRef = React.useMemo(() => ({
42
105
  startNavigation: async (start, end, type) => {
@@ -49,15 +112,25 @@ export const ExpoGaodeMapNaviView = React.forwardRef((props, ref) => {
49
112
  const endLng = end.longitude;
50
113
  return nativeRef.current.startNavigation(startLat, startLng, endLat, endLng);
51
114
  },
115
+ startNavigationWithIndependentPath: async (token, options) => {
116
+ if (!nativeRef.current)
117
+ throw new Error('ExpoGaodeMapNaviView not initialized');
118
+ return nativeRef.current.startNavigationWithIndependentPath(token, options?.routeId, options?.routeIndex, options?.naviType);
119
+ },
52
120
  stopNavigation: async () => {
53
121
  if (!nativeRef.current)
54
122
  throw new Error('ExpoGaodeMapNaviView not initialized');
55
123
  return nativeRef.current.stopNavigation();
56
124
  },
125
+ playCustomTTS: async (text, forcePlay = false) => {
126
+ if (!nativeRef.current)
127
+ throw new Error('ExpoGaodeMapNaviView not initialized');
128
+ return nativeRef.current.playCustomTTS(text, forcePlay);
129
+ },
57
130
  }), []);
58
131
  // 暴露 API 给外部 ref
59
132
  React.useImperativeHandle(ref, () => apiRef, [apiRef]);
60
- return <NativeView ref={nativeRef} {...props}/>;
133
+ return (<NativeView ref={nativeRef} {...restProps} androidStatusBarPaddingTop={resolvedAndroidStatusBarPaddingTop} mapViewModeType={resolvedMapViewModeType} carImage={resolvedCarImage} startPointImage={resolvedStartPointImage} wayPointImage={resolvedWayPointImage} endPointImage={resolvedEndPointImage} {...platformSpecificImageProps} onNavigationInfoUpdate={onNaviInfoUpdate} onNavigationStarted={onNaviStart} onNavigationEnded={onNaviEnd} onArriveDestination={onArrive} onRouteRecalculate={onReCalculate} onNavigationText={onPlayVoice} onNavigationVisualStateUpdate={onNaviVisualStateChange} onLaneInfoUpdate={onLaneInfoUpdate} onTrafficStatusesUpdate={onTrafficStatusesUpdate}/>);
61
134
  });
62
135
  ExpoGaodeMapNaviView.displayName = 'ExpoGaodeMapNaviView';
63
136
  export default ExpoGaodeMapNaviView;
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoGaodeMapNaviView.js","sourceRoot":"","sources":["../src/ExpoGaodeMapNaviView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AA2BhF,MAAM,aAAa,GAAG,2BAA2B,CAE/C,sBAAsB,CAAC,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,UAAU,CAAqD,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACtH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAuC,IAAI,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;IAE5D,YAAY;IACZ,MAAM,MAAM,GAA4B,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,eAAe,EAAE,KAAK,EAAE,KAAyB,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;YACnF,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAChF,oBAAoB;YACpB,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;YAC7B,OAAO,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/E,CAAC;QACD,cAAc,EAAE,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAChF,OAAO,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5C,CAAC;KACF,CAAC,EAAE,EAAE,CAAC,CAAC;IAER,iBAAiB;IACjB,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,EAAG,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,oBAAoB,CAAC,WAAW,GAAG,sBAAsB,CAAC;AAE1D,eAAe,oBAAoB,CAAC","sourcesContent":["import * as React from 'react';\nimport type { Coordinates, ExpoGaodeMapNaviViewProps } from './types';\nimport { createLazyNativeViewManager } from './map/utils/lazyNativeViewManager';\n\n/**\n * ExpoGaodeMapNaviView Ref 类型\n */\nexport interface ExpoGaodeMapNaviViewRef {\n /**\n * 开始导航\n */\n startNavigation: (start: Coordinates | null, end: Coordinates, type: number) => Promise<void>;\n \n /**\n * 停止导航\n */\n stopNavigation: () => Promise<void>;\n}\n\ninterface NativeExpoGaodeMapNaviViewRef {\n startNavigation: (\n startLatitude: number,\n startLongitude: number,\n endLatitude: number,\n endLongitude: number\n ) => Promise<void>;\n stopNavigation: () => Promise<void>;\n}\n\nconst getNativeView = createLazyNativeViewManager<\n ExpoGaodeMapNaviViewProps & { ref?: React.Ref<NativeExpoGaodeMapNaviViewRef> }\n>('ExpoGaodeMapNaviView');\n\n/**\n * 高德导航视图组件\n *\n * 使用高德官方的导航界面,提供完整的导航体验,包括:\n * - 路线规划和显示\n * - 实时导航信息(距离、时间、道路名称)\n * - 转向箭头和提示\n * - 路况信息\n * - 摄像头提示\n * - 语音播报\n *\n * @example\n * ```tsx\n * import { ExpoGaodeMapNaviView } from 'expo-gaode-map-navigation';\n *\n * function NavigationScreen() {\n * return (\n * <ExpoGaodeMapNaviView\n * style={{ flex: 1 }}\n * naviType={0} // GPS 导航\n * showCamera={true}\n * enableVoice={true}\n * onNaviInfoUpdate={(e) => {\n * console.log('剩余距离:', e.nativeEvent.pathRetainDistance);\n * }}\n * onArrive={() => {\n * console.log('到达目的地!');\n * }}\n * />\n * );\n * }\n * ```\n */\nexport const ExpoGaodeMapNaviView = React.forwardRef<ExpoGaodeMapNaviViewRef, ExpoGaodeMapNaviViewProps>((props, ref) => {\n const nativeRef = React.useRef<NativeExpoGaodeMapNaviViewRef | null>(null);\n const NativeView = React.useMemo(() => getNativeView(), []);\n \n // 创建 API 引用\n const apiRef: ExpoGaodeMapNaviViewRef = React.useMemo(() => ({\n startNavigation: async (start: Coordinates | null, end: Coordinates, type: number) => {\n if (!nativeRef.current) throw new Error('ExpoGaodeMapNaviView not initialized');\n // 将对象解构为单独的参数传递给原生层\n const startLat = start?.latitude ?? 0;\n const startLng = start?.longitude ?? 0;\n const endLat = end.latitude;\n const endLng = end.longitude;\n return nativeRef.current.startNavigation(startLat, startLng, endLat, endLng);\n },\n stopNavigation: async () => {\n if (!nativeRef.current) throw new Error('ExpoGaodeMapNaviView not initialized');\n return nativeRef.current.stopNavigation();\n },\n }), []);\n \n // 暴露 API 给外部 ref\n React.useImperativeHandle(ref, () => apiRef, [apiRef]);\n \n return <NativeView ref={nativeRef} {...props} />;\n});\n\nExpoGaodeMapNaviView.displayName = 'ExpoGaodeMapNaviView';\n\nexport default ExpoGaodeMapNaviView;\n"]}
1
+ {"version":3,"file":"ExpoGaodeMapNaviView.js","sourceRoot":"","sources":["../src/ExpoGaodeMapNaviView.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport type {\n Coordinates,\n ExpoGaodeMapNaviViewProps,\n NaviArriveEvent,\n NaviEndEvent,\n NaviInfoUpdateEvent,\n NaviLaneInfoEvent,\n NaviStartEvent,\n NaviTrafficStatusesEvent,\n NaviVisualStateEvent,\n PlayVoiceEvent,\n ReCalculateEvent,\n} from './types';\nimport {\n Image,\n PermissionsAndroid,\n Platform,\n StatusBar,\n type NativeSyntheticEvent,\n} from 'react-native';\nimport { createLazyNativeViewManager } from './map/utils/lazyNativeViewManager';\n\nfunction normalizeNaviImageSource(source?: ExpoGaodeMapNaviViewProps['carImage']): string | undefined {\n if (source == null) {\n return undefined;\n }\n if (typeof source === 'string') {\n return source;\n }\n return Image.resolveAssetSource(source)?.uri;\n}\n\nasync function ensureAndroidNavigationNotificationPermission(enabled: boolean): Promise<void> {\n if (!enabled || Platform.OS !== 'android' || Platform.Version < 33) {\n return;\n }\n\n try {\n const permission = PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS;\n const granted = await PermissionsAndroid.check(permission);\n if (!granted) {\n await PermissionsAndroid.request(permission);\n }\n } catch (error) {\n console.warn(\n '[expo-gaode-map-navigation] Failed to request POST_NOTIFICATIONS permission automatically.',\n error\n );\n }\n}\n\n/**\n * ExpoGaodeMapNaviView Ref 类型\n */\nexport interface ExpoGaodeMapNaviViewRef {\n /**\n * 开始导航\n */\n startNavigation: (start: Coordinates | null, end: Coordinates, type: number) => Promise<void>;\n /**\n * 在当前嵌入式导航视图中,使用独立路径组启动导航\n *\n * - 依赖当前 ExpoGaodeMapNaviView 实例\n * - 适合“路线选择页 -> 进入嵌入式导航页”这类页面内流程\n * - 若不依赖嵌入式导航视图,可改用模块级 startNaviWithIndependentPath(...)\n */\n startNavigationWithIndependentPath: (\n token: number,\n options?: {\n routeId?: number;\n routeIndex?: number;\n naviType?: number;\n }\n ) => Promise<void>;\n \n /**\n * 停止导航\n */\n stopNavigation: () => Promise<void>;\n\n /**\n * 播放自定义 TTS\n */\n playCustomTTS: (text: string, forcePlay?: boolean) => Promise<void>;\n}\n\ninterface NativeExpoGaodeMapNaviViewRef {\n startNavigation: (\n startLatitude: number,\n startLongitude: number,\n endLatitude: number,\n endLongitude: number\n ) => Promise<void>;\n startNavigationWithIndependentPath: (\n token: number,\n routeId?: number,\n routeIndex?: number,\n naviType?: number\n ) => Promise<void>;\n stopNavigation: () => Promise<void>;\n playCustomTTS: (text: string, forcePlay?: boolean) => Promise<void>;\n}\n\ninterface NativeExpoGaodeMapNaviViewProps\n extends ExpoGaodeMapNaviViewProps {\n ref?: React.Ref<NativeExpoGaodeMapNaviViewRef>;\n onNavigationInfoUpdate?: (event: NativeSyntheticEvent<NaviInfoUpdateEvent>) => void;\n onNavigationStarted?: (event: NativeSyntheticEvent<NaviStartEvent>) => void;\n onNavigationEnded?: (event: NativeSyntheticEvent<NaviEndEvent>) => void;\n onArriveDestination?: (event: NativeSyntheticEvent<NaviArriveEvent>) => void;\n onRouteRecalculate?: (event: NativeSyntheticEvent<ReCalculateEvent>) => void;\n onNavigationText?: (event: NativeSyntheticEvent<PlayVoiceEvent>) => void;\n onNavigationVisualStateUpdate?: (event: NativeSyntheticEvent<NaviVisualStateEvent>) => void;\n onLaneInfoUpdate?: (event: NativeSyntheticEvent<NaviLaneInfoEvent>) => void;\n // Unified traffic-segment event used by the library traffic bar and any\n // consumer that wants to render a fully custom traffic beam.\n onTrafficStatusesUpdate?: (event: NativeSyntheticEvent<NaviTrafficStatusesEvent>) => void;\n}\n\nconst getNativeView = createLazyNativeViewManager<\n NativeExpoGaodeMapNaviViewProps\n>('ExpoGaodeMapNaviView');\n\n/**\n * 高德导航视图组件\n *\n * 使用高德官方的导航界面,提供完整的导航体验,包括:\n * - 路线规划和显示\n * - 实时导航信息(距离、时间、道路名称)\n * - 转向箭头和提示\n * - 路况信息\n * - 摄像头提示\n * - 语音播报\n *\n * @example\n * ```tsx\n * import { ExpoGaodeMapNaviView } from 'expo-gaode-map-navigation';\n *\n * function NavigationScreen() {\n * return (\n * <ExpoGaodeMapNaviView\n * style={{ flex: 1 }}\n * naviType={0} // GPS 导航\n * showCamera={true}\n * enableVoice={true}\n * onNaviInfoUpdate={(e) => {\n * console.log('剩余距离:', e.nativeEvent.pathRetainDistance);\n * }}\n * onArrive={() => {\n * console.log('到达目的地!');\n * }}\n * />\n * );\n * }\n * ```\n */\nexport const ExpoGaodeMapNaviView = React.forwardRef<ExpoGaodeMapNaviViewRef, ExpoGaodeMapNaviViewProps>((props, ref) => {\n const nativeRef = React.useRef<NativeExpoGaodeMapNaviViewRef | null>(null);\n const hasRequestedAndroidNotificationPermissionRef = React.useRef(false);\n const NativeView = React.useMemo(() => getNativeView(), []);\n const {\n onNaviInfoUpdate,\n onNaviStart,\n onNaviEnd,\n onArrive,\n onReCalculate,\n onPlayVoice,\n onNaviVisualStateChange,\n onLaneInfoUpdate,\n onTrafficStatusesUpdate,\n isNightMode,\n mapViewModeType,\n carImage,\n fourCornersImage,\n carCompassImage,\n startPointImage,\n wayPointImage,\n endPointImage,\n cameraImage,\n androidStatusBarPaddingTop,\n ...restProps\n } = props;\n\n const resolvedAndroidStatusBarPaddingTop =\n Platform.OS === 'android' &&\n androidStatusBarPaddingTop == null &&\n props.showUIElements !== false &&\n props.hideNativeTopInfoLayout !== true\n ? (StatusBar.currentHeight ?? 0)\n : androidStatusBarPaddingTop;\n const resolvedCarImage = normalizeNaviImageSource(carImage);\n const resolvedFourCornersImage = normalizeNaviImageSource(fourCornersImage);\n const resolvedCarCompassImage = normalizeNaviImageSource(carCompassImage);\n const resolvedStartPointImage = normalizeNaviImageSource(startPointImage);\n const resolvedWayPointImage = normalizeNaviImageSource(wayPointImage);\n const resolvedEndPointImage = normalizeNaviImageSource(endPointImage);\n const resolvedCameraImage = normalizeNaviImageSource(cameraImage);\n const resolvedMapViewModeType = mapViewModeType ?? (isNightMode == null ? undefined : (isNightMode ? 1 : 0));\n const platformSpecificImageProps =\n Platform.OS === 'android'\n ? {\n fourCornersImage: resolvedFourCornersImage,\n }\n : {\n carCompassImage: resolvedCarCompassImage,\n cameraImage: resolvedCameraImage,\n };\n\n React.useEffect(() => {\n if (Platform.OS !== 'android') {\n return;\n }\n\n if (!props.androidBackgroundNavigationNotificationEnabled) {\n hasRequestedAndroidNotificationPermissionRef.current = false;\n return;\n }\n\n if (hasRequestedAndroidNotificationPermissionRef.current) {\n return;\n }\n\n hasRequestedAndroidNotificationPermissionRef.current = true;\n void ensureAndroidNavigationNotificationPermission(true);\n }, [props.androidBackgroundNavigationNotificationEnabled]);\n \n // 创建 API 引用\n const apiRef: ExpoGaodeMapNaviViewRef = React.useMemo(() => ({\n startNavigation: async (start: Coordinates | null, end: Coordinates, type: number) => {\n if (!nativeRef.current) throw new Error('ExpoGaodeMapNaviView not initialized');\n // 将对象解构为单独的参数传递给原生层\n const startLat = start?.latitude ?? 0;\n const startLng = start?.longitude ?? 0;\n const endLat = end.latitude;\n const endLng = end.longitude;\n return nativeRef.current.startNavigation(startLat, startLng, endLat, endLng);\n },\n startNavigationWithIndependentPath: async (token, options) => {\n if (!nativeRef.current) throw new Error('ExpoGaodeMapNaviView not initialized');\n return nativeRef.current.startNavigationWithIndependentPath(\n token,\n options?.routeId,\n options?.routeIndex,\n options?.naviType\n );\n },\n stopNavigation: async () => {\n if (!nativeRef.current) throw new Error('ExpoGaodeMapNaviView not initialized');\n return nativeRef.current.stopNavigation();\n },\n playCustomTTS: async (text, forcePlay = false) => {\n if (!nativeRef.current) throw new Error('ExpoGaodeMapNaviView not initialized');\n return nativeRef.current.playCustomTTS(text, forcePlay);\n },\n }), []);\n \n // 暴露 API 给外部 ref\n React.useImperativeHandle(ref, () => apiRef, [apiRef]);\n \n return (\n <NativeView\n ref={nativeRef}\n {...restProps}\n androidStatusBarPaddingTop={resolvedAndroidStatusBarPaddingTop}\n mapViewModeType={resolvedMapViewModeType}\n carImage={resolvedCarImage}\n startPointImage={resolvedStartPointImage}\n wayPointImage={resolvedWayPointImage}\n endPointImage={resolvedEndPointImage}\n {...platformSpecificImageProps}\n onNavigationInfoUpdate={onNaviInfoUpdate}\n onNavigationStarted={onNaviStart}\n onNavigationEnded={onNaviEnd}\n onArriveDestination={onArrive}\n onRouteRecalculate={onReCalculate}\n onNavigationText={onPlayVoice}\n onNavigationVisualStateUpdate={onNaviVisualStateChange}\n onLaneInfoUpdate={onLaneInfoUpdate}\n onTrafficStatusesUpdate={onTrafficStatusesUpdate}\n />\n );\n});\n\nExpoGaodeMapNaviView.displayName = 'ExpoGaodeMapNaviView';\n\nexport default ExpoGaodeMapNaviView;\n"]}