Skip to content

Commit 672bcdf

Browse files
committed
feat(Android):增加适配高德地图路径模拟.
1 parent 76ce290 commit 672bcdf

File tree

9 files changed

+137
-25
lines changed

9 files changed

+137
-25
lines changed

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockProxyManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,15 @@ object GpsMockProxyManager {
188188
for (aMapLocationChangedListenerProxy in mAMapLocationChangedListenerProxies) {
189189
aMapLocationChangedListenerProxy?.onLocationChanged(location)
190190
}
191-
if (GpsMockManager.mockAMapNavLocation()) {
191+
// if (GpsMockManager.getInstance().isMockingRoute) {
192192
for (aMapNaviListenerProxy in mAMapNaviListenerProxies) {
193193
aMapNaviListenerProxy?.onLocationChange(
194194
LocationBuilder.toAMapNaviLocation(
195195
location
196196
)
197197
)
198198
}
199-
}
199+
// }
200200

201201

202202
}

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationChangedListenerProxy.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.didichuxing.doraemonkit.gps_mock.map;
22

33
import android.location.Location;
4+
import android.location.LocationManager;
45

56
import com.amap.api.maps.LocationSource;
67
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
8+
import com.didichuxing.doraemonkit.util.CoordinateUtils;
79
import com.didichuxing.doraemonkit.util.LogHelper;
810

11+
import java.util.Arrays;
12+
913
/**
1014
* ================================================
1115
* 作 者:jint(金台)
@@ -26,12 +30,15 @@ public AMapLocationChangedListenerProxy(LocationSource.OnLocationChangedListener
2630

2731
@Override
2832
public void onLocationChanged(Location location) {
29-
3033
if (GpsMockManager.getInstance().isMocking()) {
31-
location.setLatitude(GpsMockManager.getInstance().getLatitude());
32-
location.setLongitude(GpsMockManager.getInstance().getLongitude());
34+
double[] res = CoordinateUtils.bd09ToGcj02(GpsMockManager.getInstance().getLongitude(), GpsMockManager.getInstance().getLatitude());
35+
LogHelper.d("onLocationChanged", "===amap===origin_loc==>" + location.toString()
36+
+ "\n before_trans_loc==>" + GpsMockManager.getInstance().getLatitude() + " lng==>" +GpsMockManager.getInstance().getLongitude()
37+
+ "\n after_trans_loc==>" + Arrays.toString(res));
38+
location.setLatitude(res[1]);
39+
location.setLongitude(res[0]);
40+
location.setProvider(LocationManager.GPS_PROVIDER);
3341
}
34-
LogHelper.i(TAG, "===onLocationChanged====");
3542
if (mOnLocationChangedListener != null) {
3643
mOnLocationChangedListener.onLocationChanged(location);
3744
}

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationClientProxy.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package com.didichuxing.doraemonkit.gps_mock.map;
22

3+
import android.location.LocationManager;
4+
35
import com.amap.api.location.AMapLocation;
46
import com.amap.api.location.AMapLocationClient;
57
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
68
import com.didichuxing.doraemonkit.gps_mock.gpsmock.LocationBuilder;
9+
import com.didichuxing.doraemonkit.util.CoordinateUtils;
10+
import com.didichuxing.doraemonkit.util.LogHelper;
711
import com.didichuxing.doraemonkit.util.ReflectUtils;
812

13+
import java.util.Arrays;
14+
915
/**
1016
* ================================================
1117
* 作 者:jint(金台)
@@ -26,8 +32,13 @@ public static AMapLocation getLastKnownLocation(AMapLocationClient client) {
2632

2733
if (GpsMockManager.getInstance().isMocking()) {
2834
AMapLocation mapLocation = LocationBuilder.toAMapLocation(new LocationBuilder().build());
29-
mapLocation.setLatitude(GpsMockManager.getInstance().getLatitude());
30-
mapLocation.setLongitude(GpsMockManager.getInstance().getLongitude());
35+
double[] res = CoordinateUtils.bd09ToGcj02(GpsMockManager.getInstance().getLongitude(), GpsMockManager.getInstance().getLatitude());
36+
LogHelper.d(TAG, "===amap===origin_loc==>" + mapLocation.toString()
37+
+ "\n before_trans_loc==>" + GpsMockManager.getInstance().getLatitude() + " lng==>" +GpsMockManager.getInstance().getLongitude()
38+
+ "\n after_trans_loc==>" + Arrays.toString(res));
39+
mapLocation.setLatitude(res[1]);
40+
mapLocation.setLongitude(res[0]);
41+
mapLocation.setProvider(LocationManager.GPS_PROVIDER);
3142
//通过反射强制改变p的值 原因:看mapLocation.setErrorCode
3243
ReflectUtils.reflect(mapLocation).field("p", 0);
3344
mapLocation.setErrorInfo("success");

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationListenerProxy.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package com.didichuxing.doraemonkit.gps_mock.map;
22

3+
import android.location.LocationManager;
4+
35
import com.amap.api.location.AMapLocation;
46
import com.amap.api.location.AMapLocationListener;
57
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
68
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
9+
import com.didichuxing.doraemonkit.util.CoordinateUtils;
10+
import com.didichuxing.doraemonkit.util.LogHelper;
711
import com.didichuxing.doraemonkit.util.ReflectUtils;
812

13+
import java.util.Arrays;
14+
915
/**
1016
* ================================================
1117
* 作 者:jint(金台)
@@ -16,6 +22,7 @@
1622
* ================================================
1723
*/
1824
public class AMapLocationListenerProxy implements AMapLocationListener {
25+
private static final String TAG = AMapLocationListenerProxy.class.getSimpleName();
1926
public AMapLocationListener aMapLocationListener;
2027

2128
public AMapLocationListenerProxy(AMapLocationListener aMapLocationListener) {
@@ -27,8 +34,13 @@ public AMapLocationListenerProxy(AMapLocationListener aMapLocationListener) {
2734
public void onLocationChanged(AMapLocation mapLocation) {
2835
if (GpsMockManager.getInstance().isMocking()) {
2936
try {
30-
mapLocation.setLatitude(GpsMockManager.getInstance().getLatitude());
31-
mapLocation.setLongitude(GpsMockManager.getInstance().getLongitude());
37+
double[] res = CoordinateUtils.bd09ToGcj02(GpsMockManager.getInstance().getLongitude(), GpsMockManager.getInstance().getLatitude());
38+
LogHelper.d(TAG, "===amap===origin_loc==>" + mapLocation.toString()
39+
+ "\n before_trans_loc==>" + GpsMockManager.getInstance().getLatitude() + " lng==>" +GpsMockManager.getInstance().getLongitude()
40+
+ "\n after_trans_loc==>" + Arrays.toString(res));
41+
mapLocation.setLatitude(res[1]);
42+
mapLocation.setLongitude(res[0]);
43+
mapLocation.setProvider(LocationManager.GPS_PROVIDER);
3244
//通过反射强制改变p的值 原因:看mapLocation.setErrorCode
3345
ReflectUtils.reflect(mapLocation).field("p", 0);
3446
mapLocation.setErrorInfo("success");

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationSourceProxy.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.didichuxing.doraemonkit.gps_mock.map;
22

33
import com.amap.api.maps.LocationSource;
4+
import com.didichuxing.doraemonkit.util.LogHelper;
45

56
/**
67
* ================================================
@@ -21,6 +22,7 @@ public AMapLocationSourceProxy(LocationSource mLocationSource) {
2122

2223
@Override
2324
public void activate(OnLocationChangedListener onLocationChangedListener) {
25+
LogHelper.d("AMapLocationSourceProxy", "===amap===activate");
2426
if (mLocationSource != null) {
2527
onLocationChangedListener = new AMapLocationChangedListenerProxy(onLocationChangedListener);
2628
mLocationSource.activate(onLocationChangedListener);

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapNaviListenerProxy.java

Lines changed: 79 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
11
package com.didichuxing.doraemonkit.gps_mock.map;
22

3-
import android.util.Log;
4-
53
import com.amap.api.navi.AMapNavi;
64
import com.amap.api.navi.AMapNaviListener;
75
import com.amap.api.navi.model.AMapCalcRouteResult;
86
import com.amap.api.navi.model.AMapLaneInfo;
97
import com.amap.api.navi.model.AMapModelCross;
108
import com.amap.api.navi.model.AMapNaviCameraInfo;
119
import com.amap.api.navi.model.AMapNaviCross;
10+
import com.amap.api.navi.model.AMapNaviLink;
1211
import com.amap.api.navi.model.AMapNaviLocation;
1312
import com.amap.api.navi.model.AMapNaviPath;
1413
import com.amap.api.navi.model.AMapNaviRouteNotifyData;
14+
import com.amap.api.navi.model.AMapNaviStep;
1515
import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo;
1616
import com.amap.api.navi.model.AMapServiceAreaInfo;
1717
import com.amap.api.navi.model.AimLessModeCongestionInfo;
1818
import com.amap.api.navi.model.AimLessModeStat;
1919
import com.amap.api.navi.model.NaviInfo;
2020
import com.amap.api.navi.model.NaviLatLng;
21+
import com.baidu.mapapi.search.core.RouteNode;
22+
import com.baidu.mapapi.utils.CoordinateConverter;
2123
import com.didichuxing.doraemonkit.DoKit;
24+
import com.didichuxing.doraemonkit.config.GpsMockConfig;
25+
import com.didichuxing.doraemonkit.gps_mock.common.BdMapRouteData;
2226
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockManager;
2327
import com.didichuxing.doraemonkit.gps_mock.gpsmock.GpsMockProxyManager;
28+
import com.didichuxing.doraemonkit.util.CoordinateUtils;
29+
import com.didichuxing.doraemonkit.util.LogHelper;
2430

31+
import java.util.ArrayList;
32+
import java.util.Arrays;
2533
import java.util.HashMap;
2634
import java.util.List;
2735

@@ -75,10 +83,12 @@ public void onTrafficStatusUpdate() {
7583

7684
@Override
7785
public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
78-
if (GpsMockManager.mockAMapNavLocation()) {
79-
aMapNaviLocation.setCoord(new NaviLatLng(GpsMockManager.getInstance().getLatitude(), GpsMockManager.getInstance().getLongitude()));
86+
if (GpsMockManager.getInstance().isMocking()) {
87+
double[] res = CoordinateUtils.bd09ToGcj02(GpsMockManager.getInstance().getLongitude(), GpsMockManager.getInstance().getLatitude());
88+
aMapNaviLocation.setCoord(new NaviLatLng(res[1], res[0]));
89+
aMapNaviLocation.setSpeed(GpsMockConfig.getRouteMockSpeed());
8090
}
81-
// LogHelper.i(TAG, "====aMapNaviLocation===" + aMapNaviLocation.getCoord().toString());
91+
LogHelper.d(TAG, "===amap===onLocationChange" + aMapNaviLocation.getCoord().toString());
8292
if (aMapNaviListener != null) {
8393
aMapNaviListener.onLocationChange(aMapNaviLocation);
8494
}
@@ -149,7 +159,7 @@ public void onGpsOpenStatus(boolean b) {
149159

150160
@Override
151161
public void onNaviInfoUpdate(NaviInfo naviInfo) {
152-
// LogHelper.i(TAG, "====onNaviInfoUpdate====" + naviInfo.getPathRetainDistance());
162+
LogHelper.d(TAG, "====onNaviInfoUpdate====" + naviInfo.getPathRetainDistance());
153163
if (aMapNaviListener != null) {
154164
aMapNaviListener.onNaviInfoUpdate(naviInfo);
155165
}
@@ -277,20 +287,76 @@ public void onPlayRing(int i) {
277287
@Override
278288
public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {
279289
try {
290+
// 重新做了路径规划,则尝试打断当前模拟.
291+
GpsMockManager.getInstance().interruptRouteMockThread();
292+
int[] routIds = aMapCalcRouteResult.getRouteid();
280293
// 获取路线数据对象
281294
HashMap<Integer, AMapNaviPath> naviPaths = AMapNavi.getInstance(DoKit.INSTANCE.getAPPLICATION()).getNaviPaths();
282-
Log.i(TAG, "高德导航===onCalculateRouteSuccess $naviPaths " + naviPaths + " " + aMapCalcRouteResult.toString());
283-
// 绘制显示路径
284-
List<NaviLatLng> coords = naviPaths.get(12).getSteps().get(0).getCoords();
285-
for (NaviLatLng latLng : coords) {
286-
Log.i(TAG, "高德导航===onCalculateRouteSuccess $naviPaths " + latLng.toString());
295+
LogHelper.d(TAG, "===amap===onCalculateRouteSuccess $naviPaths " + naviPaths.size() + " routeId " + Arrays.toString(routIds));
296+
297+
CoordinateConverter converter = new CoordinateConverter().from(CoordinateConverter.CoordType.COMMON);
298+
// 将所有点转换成百度坐标点
299+
List<com.baidu.mapapi.model.LatLng> bdPoints = new ArrayList<>();
300+
AMapNaviPath naviPath = naviPaths.get(routIds[0]);
301+
List<AMapNaviStep> steps = naviPath.getSteps();
302+
int linkSize = 0;
303+
int stepSize = 0;
304+
for (AMapNaviStep step : steps) {
305+
stepSize += step.getCoords().size();
306+
List<AMapNaviLink> links = step.getLinks();
307+
boolean notNavi = false;
308+
if (links != null && links.size() > 0){
309+
for (AMapNaviLink link : links){
310+
if (link == null) continue;
311+
int linkType = link.getLinkType(); // 获取道路类型 0-普通道路 1-航道 2-隧道 3-桥梁 4-高架桥 注意:该接口仅驾车模式有效
312+
int roadClass = link.getRoadClass(); //获取该Link道路等级 * 0 高速公路 * 1 国道 * 2 省道 * 3 县道 * 4 乡公路 * 5 县乡村内部道路 * 6 主要大街、城市快速道 * 7 主要道路 * 8 次要道路 * 9 普通道路 * 10 非导航道路
313+
List<NaviLatLng> coords = link.getCoords();
314+
if (coords == null) continue;
315+
linkSize += coords.size();
316+
// 过滤非开车导航坐标点(下车后)
317+
if (roadClass == 10){
318+
notNavi = true;
319+
break;
320+
}
321+
}
322+
}
323+
324+
if (notNavi) continue;
325+
for (NaviLatLng latLng : step.getCoords()){
326+
com.baidu.mapapi.model.LatLng sourceLatLng = new com.baidu.mapapi.model.LatLng(latLng.getLatitude(), latLng.getLongitude());
327+
//转换坐标
328+
converter.coord(sourceLatLng);
329+
com.baidu.mapapi.model.LatLng desLatLng = converter.convert();
330+
bdPoints.add(desLatLng);
331+
}
287332
}
288333

334+
LogHelper.d(TAG, "===amap===total points==>" + naviPath.getCoordList().size() + " " + naviPath.getCoordList().get(naviPath.getCoordList().size() - 1)
335+
+ " \n" + bdPoints.size() + " " + bdPoints.get(bdPoints.size() - 1)
336+
+ "\nlinkSize=" + linkSize + " stepSize=" + stepSize);
337+
BdMapRouteData bdMapRouteData = new BdMapRouteData();
338+
bdMapRouteData.setAllPoints(bdPoints);
339+
bdMapRouteData.setTotalDistance(naviPath.getAllLength());
340+
341+
RouteNode startNode = new RouteNode();
342+
com.baidu.mapapi.model.LatLng sourceStartLatLng = new com.baidu.mapapi.model.LatLng(naviPath.getStartPoint().getLatitude(), naviPath.getStartPoint().getLongitude());
343+
com.baidu.mapapi.model.LatLng desStartLatLng = converter.coord(sourceStartLatLng).convert();
344+
startNode.setLocation(desStartLatLng);
345+
RouteNode terminalNode = new RouteNode();
346+
com.baidu.mapapi.model.LatLng sourceTerminalLatLng = new com.baidu.mapapi.model.LatLng(naviPath.getEndPoint().getLatitude(), naviPath.getEndPoint().getLongitude());
347+
com.baidu.mapapi.model.LatLng desTerminalLatLng = converter.coord(sourceTerminalLatLng).convert();
348+
terminalNode.setLocation(desTerminalLatLng);
349+
bdMapRouteData.setStartNode(startNode);
350+
bdMapRouteData.setTerminalNode(terminalNode);
351+
bdMapRouteData.setRouteDataFromBiz(true);
352+
353+
GpsMockManager.getInstance().setBdMockDrivingRouteLine(bdMapRouteData);
354+
289355
if (aMapNaviListener != null) {
290356
aMapNaviListener.onCalculateRouteSuccess(aMapCalcRouteResult);
291357
}
292-
}catch (Exception e){
293-
Log.e(TAG, e.getMessage());
358+
} catch (Exception e) {
359+
LogHelper.e(TAG, "===amap===onCalculateRouteSuccess error " + e.getMessage());
294360
}
295361
}
296362

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/CustomDialogFragment.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
public class CustomDialogFragment extends DialogFragment {
1616

17-
private IDialogHelper mDialogHelper;
17+
private final IDialogHelper mDialogHelper;
1818

1919
public CustomDialogFragment(int contentLayoutId, IDialogHelper dialogHelper) {
2020
super(contentLayoutId);
@@ -44,4 +44,10 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
4444
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
4545
super.onActivityCreated(savedInstanceState);
4646
}
47+
48+
@Override
49+
public void onDestroy() {
50+
super.onDestroy();
51+
mDialogHelper.onDestroy();
52+
}
4753
}

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/IDialogHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44

55
public interface IDialogHelper {
66
void init(View root);
7+
8+
void onDestroy();
79
}

Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/PositionSelectDialogHelper.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import android.text.Editable;
55
import android.text.TextUtils;
66
import android.text.TextWatcher;
7-
import android.util.Log;
87
import android.view.View;
98
import android.widget.EditText;
109

@@ -113,5 +112,12 @@ public void onGetSuggestionResult(SuggestionResult res) {
113112
mPositionDataList.addAll(res.getAllSuggestions());
114113
mAdapter.notifyDataSetChanged();
115114
}
115+
116+
@Override
117+
public void onDestroy() {
118+
if (mSuggestionSearch != null) {
119+
mSuggestionSearch.destroy();
120+
}
121+
}
116122
}
117123

0 commit comments

Comments
 (0)