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.
- package/README.md +296 -7
- package/android/build.gradle +12 -4
- package/android/src/main/AndroidManifest.xml +10 -1
- package/android/src/main/cpp/cluster_jni.cpp +56 -0
- package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapModule.kt +49 -8
- package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapOfflineModule.kt +83 -15
- package/android/src/main/java/expo/modules/gaodemap/map/ExpoGaodeMapView.kt +13 -3
- package/android/src/main/java/expo/modules/gaodemap/map/managers/UIManager.kt +36 -39
- package/android/src/main/java/expo/modules/gaodemap/map/modules/SDKInitializer.kt +23 -17
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/ClusterView.kt +5 -2
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapView.kt +122 -10
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/HeatMapViewModule.kt +2 -2
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerView.kt +37 -25
- package/android/src/main/java/expo/modules/gaodemap/map/overlays/MarkerViewModule.kt +6 -6
- package/android/src/main/java/expo/modules/gaodemap/map/search/ExpoGaodeMapSearchModule.kt +751 -0
- package/android/src/main/java/expo/modules/gaodemap/map/utils/GeometryUtils.kt +103 -0
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviView.kt +1408 -394
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNaviViewModule.kt +121 -1
- package/android/src/main/java/expo/modules/gaodemap/navigation/ExpoGaodeMapNavigationModule.kt +14 -28
- package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/IndependentRouteListener.kt +28 -3
- package/android/src/main/java/expo/modules/gaodemap/navigation/listeners/RouteCalculateListener.kt +2 -2
- package/android/src/main/java/expo/modules/gaodemap/navigation/managers/IndependentRouteManager.kt +114 -15
- package/android/src/main/java/expo/modules/gaodemap/navigation/routes/drive/DriveTruckRouteCalculator.kt +24 -35
- package/android/src/main/java/expo/modules/gaodemap/navigation/services/IndependentRouteService.kt +50 -36
- package/android/src/main/java/expo/modules/gaodemap/navigation/services/NavigationForegroundService.kt +661 -0
- package/android/src/main/java/expo/modules/gaodemap/navigation/utils/Converters.kt +21 -12
- package/android/src/main/res/drawable/ic_nav_notification_small.xml +10 -0
- package/android/src/main/res/drawable/landback_0.png +0 -0
- package/android/src/main/res/drawable/landback_1.png +0 -0
- package/android/src/main/res/drawable/landback_2.png +0 -0
- package/android/src/main/res/drawable/landback_3.png +0 -0
- package/android/src/main/res/drawable/landback_4.png +0 -0
- package/android/src/main/res/drawable/landback_5.png +0 -0
- package/android/src/main/res/drawable/landback_6.png +0 -0
- package/android/src/main/res/drawable/landback_7.png +0 -0
- package/android/src/main/res/drawable/landback_8.png +0 -0
- package/android/src/main/res/drawable/landback_9.png +0 -0
- package/android/src/main/res/drawable/landback_a.png +0 -0
- package/android/src/main/res/drawable/landback_b.png +0 -0
- package/android/src/main/res/drawable/landback_c.png +0 -0
- package/android/src/main/res/drawable/landback_d.png +0 -0
- package/android/src/main/res/drawable/landback_e.png +0 -0
- package/android/src/main/res/drawable/landback_f.png +0 -0
- package/android/src/main/res/drawable/landback_g.png +0 -0
- package/android/src/main/res/drawable/landback_h.png +0 -0
- package/android/src/main/res/drawable/landback_i.png +0 -0
- package/android/src/main/res/drawable/landback_j.png +0 -0
- package/android/src/main/res/drawable/landback_k.png +0 -0
- package/android/src/main/res/drawable/landback_l.png +0 -0
- package/android/src/main/res/drawable/landfront_0.png +0 -0
- package/android/src/main/res/drawable/landfront_00.png +0 -0
- package/android/src/main/res/drawable/landfront_1.png +0 -0
- package/android/src/main/res/drawable/landfront_11.png +0 -0
- package/android/src/main/res/drawable/landfront_20.png +0 -0
- package/android/src/main/res/drawable/landfront_21.png +0 -0
- package/android/src/main/res/drawable/landfront_22.png +0 -0
- package/android/src/main/res/drawable/landfront_3.png +0 -0
- package/android/src/main/res/drawable/landfront_33.png +0 -0
- package/android/src/main/res/drawable/landfront_40.png +0 -0
- package/android/src/main/res/drawable/landfront_43.png +0 -0
- package/android/src/main/res/drawable/landfront_44.png +0 -0
- package/android/src/main/res/drawable/landfront_5.png +0 -0
- package/android/src/main/res/drawable/landfront_55.png +0 -0
- package/android/src/main/res/drawable/landfront_61.png +0 -0
- package/android/src/main/res/drawable/landfront_63.png +0 -0
- package/android/src/main/res/drawable/landfront_66.png +0 -0
- package/android/src/main/res/drawable/landfront_70.png +0 -0
- package/android/src/main/res/drawable/landfront_71.png +0 -0
- package/android/src/main/res/drawable/landfront_73.png +0 -0
- package/android/src/main/res/drawable/landfront_77.png +0 -0
- package/android/src/main/res/drawable/landfront_8.png +0 -0
- package/android/src/main/res/drawable/landfront_88.png +0 -0
- package/android/src/main/res/drawable/landfront_90.png +0 -0
- package/android/src/main/res/drawable/landfront_95.png +0 -0
- package/android/src/main/res/drawable/landfront_99.png +0 -0
- package/android/src/main/res/drawable/landfront_a0.png +0 -0
- package/android/src/main/res/drawable/landfront_a8.png +0 -0
- package/android/src/main/res/drawable/landfront_aa.png +0 -0
- package/android/src/main/res/drawable/landfront_b1.png +0 -0
- package/android/src/main/res/drawable/landfront_b5.png +0 -0
- package/android/src/main/res/drawable/landfront_bb.png +0 -0
- package/android/src/main/res/drawable/landfront_c3.png +0 -0
- package/android/src/main/res/drawable/landfront_c8.png +0 -0
- package/android/src/main/res/drawable/landfront_cc.png +0 -0
- package/android/src/main/res/drawable/landfront_d.png +0 -0
- package/android/src/main/res/drawable/landfront_dd.png +0 -0
- package/android/src/main/res/drawable/landfront_e1.png +0 -0
- package/android/src/main/res/drawable/landfront_e5.png +0 -0
- package/android/src/main/res/drawable/landfront_ee.png +0 -0
- package/android/src/main/res/drawable/landfront_f0.png +0 -0
- package/android/src/main/res/drawable/landfront_f1.png +0 -0
- package/android/src/main/res/drawable/landfront_f5.png +0 -0
- package/android/src/main/res/drawable/landfront_ff.png +0 -0
- package/android/src/main/res/drawable/landfront_g3.png +0 -0
- package/android/src/main/res/drawable/landfront_g5.png +0 -0
- package/android/src/main/res/drawable/landfront_gg.png +0 -0
- package/android/src/main/res/drawable/landfront_h1.png +0 -0
- package/android/src/main/res/drawable/landfront_h3.png +0 -0
- package/android/src/main/res/drawable/landfront_h5.png +0 -0
- package/android/src/main/res/drawable/landfront_hh.png +0 -0
- package/android/src/main/res/drawable/landfront_i0.png +0 -0
- package/android/src/main/res/drawable/landfront_i3.png +0 -0
- package/android/src/main/res/drawable/landfront_i5.png +0 -0
- package/android/src/main/res/drawable/landfront_ii.png +0 -0
- package/android/src/main/res/drawable/landfront_j1.png +0 -0
- package/android/src/main/res/drawable/landfront_j8.png +0 -0
- package/android/src/main/res/drawable/landfront_jj.png +0 -0
- package/android/src/main/res/drawable/landfront_kk.png +0 -0
- package/android/src/main/res/drawable/landfront_ll.png +0 -0
- package/android/src/main/res/drawable/nav_notification_brand_icon.xml +16 -0
- package/android/src/main/res/drawable/navi_arrow_leftline.png +0 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_center.xml +5 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_left.xml +8 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_over.xml +6 -0
- package/android/src/main/res/drawable/navi_lane_shape_bg_right.xml +8 -0
- package/android/src/main/res/drawable-nodpi/nav_tracker_car.png +0 -0
- package/build/ExpoGaodeMapNaviView.d.ts +16 -0
- package/build/ExpoGaodeMapNaviView.d.ts.map +1 -1
- package/build/ExpoGaodeMapNaviView.js +74 -1
- package/build/ExpoGaodeMapNaviView.js.map +1 -1
- package/build/index.d.ts +56 -8
- package/build/index.d.ts.map +1 -1
- package/build/index.js +452 -10
- package/build/index.js.map +1 -1
- package/build/map/ExpoGaodeMapModule.d.ts +15 -13
- package/build/map/ExpoGaodeMapModule.d.ts.map +1 -1
- package/build/map/ExpoGaodeMapModule.js +31 -39
- package/build/map/ExpoGaodeMapModule.js.map +1 -1
- package/build/map/ExpoGaodeMapOfflineModule.d.ts +5 -0
- package/build/map/ExpoGaodeMapOfflineModule.d.ts.map +1 -1
- package/build/map/ExpoGaodeMapOfflineModule.js.map +1 -1
- package/build/map/ExpoGaodeMapView.d.ts +3 -4
- package/build/map/ExpoGaodeMapView.d.ts.map +1 -1
- package/build/map/ExpoGaodeMapView.js +28 -25
- package/build/map/ExpoGaodeMapView.js.map +1 -1
- package/build/map/components/overlays/Circle.d.ts.map +1 -1
- package/build/map/components/overlays/Circle.js +1 -30
- package/build/map/components/overlays/Circle.js.map +1 -1
- package/build/map/components/overlays/Cluster.d.ts.map +1 -1
- package/build/map/components/overlays/Cluster.js +1 -42
- package/build/map/components/overlays/Cluster.js.map +1 -1
- package/build/map/components/overlays/HeatMap.d.ts.map +1 -1
- package/build/map/components/overlays/HeatMap.js +21 -21
- package/build/map/components/overlays/HeatMap.js.map +1 -1
- package/build/map/components/overlays/Marker.d.ts.map +1 -1
- package/build/map/components/overlays/Marker.js +76 -80
- package/build/map/components/overlays/Marker.js.map +1 -1
- package/build/map/components/overlays/Polygon.d.ts.map +1 -1
- package/build/map/components/overlays/Polygon.js +1 -25
- package/build/map/components/overlays/Polygon.js.map +1 -1
- package/build/map/components/overlays/Polyline.d.ts.map +1 -1
- package/build/map/components/overlays/Polyline.js +1 -31
- package/build/map/components/overlays/Polyline.js.map +1 -1
- package/build/map/index.d.ts +9 -2
- package/build/map/index.d.ts.map +1 -1
- package/build/map/index.js +9 -2
- package/build/map/index.js.map +1 -1
- package/build/map/search/ExpoGaodeMapSearch.types.d.ts +340 -0
- package/build/map/search/ExpoGaodeMapSearch.types.d.ts.map +1 -0
- package/build/map/search/ExpoGaodeMapSearch.types.js +19 -0
- package/build/map/search/ExpoGaodeMapSearch.types.js.map +1 -0
- package/build/map/search/ExpoGaodeMapSearchModule.d.ts +74 -0
- package/build/map/search/ExpoGaodeMapSearchModule.d.ts.map +1 -0
- package/build/map/search/ExpoGaodeMapSearchModule.js +47 -0
- package/build/map/search/ExpoGaodeMapSearchModule.js.map +1 -0
- package/build/map/search/index.d.ts +156 -0
- package/build/map/search/index.d.ts.map +1 -0
- package/build/map/search/index.js +171 -0
- package/build/map/search/index.js.map +1 -0
- package/build/map/types/index.d.ts +2 -2
- package/build/map/types/index.d.ts.map +1 -1
- package/build/map/types/index.js.map +1 -1
- package/build/map/types/map-view.types.d.ts +4 -2
- package/build/map/types/map-view.types.d.ts.map +1 -1
- package/build/map/types/map-view.types.js.map +1 -1
- package/build/map/types/native-module.types.d.ts +11 -12
- package/build/map/types/native-module.types.d.ts.map +1 -1
- package/build/map/types/native-module.types.js.map +1 -1
- package/build/map/types/overlays.types.d.ts +9 -14
- package/build/map/types/overlays.types.d.ts.map +1 -1
- package/build/map/types/overlays.types.js.map +1 -1
- package/build/map/types/route-playback.types.d.ts +16 -0
- package/build/map/types/route-playback.types.d.ts.map +1 -1
- package/build/map/types/route-playback.types.js.map +1 -1
- package/build/map/utils/ErrorHandler.js +11 -11
- package/build/map/utils/ErrorHandler.js.map +1 -1
- package/build/map/utils/OfflineMapManager.d.ts +4 -0
- package/build/map/utils/OfflineMapManager.d.ts.map +1 -1
- package/build/map/utils/OfflineMapManager.js +6 -0
- package/build/map/utils/OfflineMapManager.js.map +1 -1
- package/build/types/coordinates.types.d.ts +3 -0
- package/build/types/coordinates.types.d.ts.map +1 -1
- package/build/types/coordinates.types.js.map +1 -1
- package/build/types/independent.types.d.ts +111 -12
- package/build/types/independent.types.d.ts.map +1 -1
- package/build/types/independent.types.js.map +1 -1
- package/build/types/native-module.types.d.ts +1 -1
- package/build/types/native-module.types.js.map +1 -1
- package/build/types/naviview.types.d.ts +304 -14
- package/build/types/naviview.types.d.ts.map +1 -1
- package/build/types/naviview.types.js.map +1 -1
- package/build/types/route.types.d.ts +12 -2
- package/build/types/route.types.d.ts.map +1 -1
- package/build/types/route.types.js.map +1 -1
- package/expo-module.config.json +4 -2
- package/ios/ExpoGaodeMapNaviView.swift +2331 -201
- package/ios/ExpoGaodeMapNaviViewModule.swift +109 -1
- package/ios/ExpoGaodeMapNavigation.podspec +2 -1
- package/ios/ExpoGaodeMapNavigationModule.swift +7 -5
- package/ios/managers/IndependentRouteManager.swift +90 -26
- package/ios/map/ExpoGaodeMapModule.swift +72 -21
- package/ios/map/ExpoGaodeMapOfflineModule.swift +61 -0
- package/ios/map/ExpoGaodeMapSearchModule.swift +773 -0
- package/ios/map/ExpoGaodeMapView.swift +23 -5
- package/ios/map/GaodeMapPrivacyManager.swift +26 -18
- package/ios/map/cpp/GeometryEngine.cpp +112 -0
- package/ios/map/cpp/GeometryEngine.hpp +21 -0
- package/ios/map/modules/LocationManager.swift +37 -5
- package/ios/map/overlays/MarkerView.swift +11 -11
- package/ios/map/overlays/MarkerViewModule.swift +4 -4
- package/ios/map/overlays/PolylineView.swift +6 -12
- package/ios/map/utils/ClusterNative.h +8 -0
- package/ios/map/utils/ClusterNative.mm +27 -0
- package/ios/map/utils/PermissionManager.swift +115 -6
- package/ios/routes/drive/DriveTruckRouteCalculator.swift +165 -77
- package/ios/routes/walkride/WalkRideRouteCalculator.swift +127 -1
- package/ios/services/IndependentRouteService.swift +198 -39
- package/ios/services/NavigationLiveActivityAttributes.swift +48 -0
- package/ios/services/NavigationLiveActivityManager.swift +359 -0
- package/package.json +22 -7
- package/plugin/build/withGaodeMap.d.ts +8 -0
- package/plugin/build/withGaodeMap.js +60 -4
- package/scripts/check-expo-modules.js +68 -0
- package/shared/cpp/GeometryEngine.cpp +112 -0
- package/shared/cpp/GeometryEngine.hpp +21 -0
- package/widget-template/README.md +46 -0
- package/widget-template/ios/NavigationLiveActivityWidget.swift +367 -0
- 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
|
-
"
|
|
84
|
-
"
|
|
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
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
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
|
-
|
|
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
|
|
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?.
|
|
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
|
|
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>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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>
|
|
Binary file
|
|
Binary file
|
|
@@ -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,
|
|
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} {...
|
|
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"]}
|