From 98829d9e9ee4bb190ee2dbf9c25beebeee4b08ec Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Wed, 9 Nov 2022 14:22:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=87=87=E9=9B=86=E6=97=B6=E8=B7=AF=E5=BE=84=E8=A7=84=E5=88=92?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/AutoTakePictureActivity.java | 665 +++++++++++------- .../outdoor/util/FileSpliteMergeUtils.kt | 6 +- .../com/navinfo/outdoor/util/NaviUtils.java | 11 +- .../res/mipmap-xxhdpi/navigation_distance.png | Bin 0 -> 5835 bytes .../navigation_distance_disable.png | Bin 0 -> 5973 bytes 5 files changed, 408 insertions(+), 274 deletions(-) create mode 100644 app/src/main/res/mipmap-xxhdpi/navigation_distance.png create mode 100644 app/src/main/res/mipmap-xxhdpi/navigation_distance_disable.png diff --git a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java index a4d7167..112d4eb 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java @@ -88,11 +88,17 @@ import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.SizeSelector; import com.otaliastudios.cameraview.size.SizeSelectors; import com.tencent.map.geolocation.TencentLocation; +import com.tencent.map.geolocation.TencentMotion; +import com.tencent.map.geolocation.TencentPoi; +import com.tencent.map.navi.TencentNaviCallback; import com.tencent.map.navi.TencentNaviManager; import com.tencent.map.navi.TencentRouteSearchCallback; import com.tencent.map.navi.car.TencentCarNaviManager; +import com.tencent.map.navi.data.AttachedLocation; import com.tencent.map.navi.data.CalcRouteResult; import com.tencent.map.navi.data.NaviPoi; +import com.tencent.map.navi.data.NaviTts; +import com.tencent.map.navi.data.ParallelRoadStatus; import com.tencent.map.navi.data.RouteData; import com.tencent.tencentmap.mapsdk.maps.CameraUpdate; import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory; @@ -213,6 +219,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic private TencentLocation oldCurrentLocation = null; private MediaPlayer mediaPlayer; private ImageView imgNaviDistance; // 自动规划到距离最近的数据开关 + private Polyline currentNaviLine; // 当前界面上正显示的导航路径线,重绘路径时需要清除此前已绘制的路径 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -426,6 +433,16 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic @Override public void onClick(View view) { imgNaviDistance.setSelected(!imgNaviDistance.isSelected()); + if (view.isSelected()) { + // 开始自动匹配 + if (roadMatchEntityList.isEmpty()) { + navi2NearestPoiEntity(); + } + } else { + if (currentNaviLine!=null) { + currentNaviLine.remove(); + } + } } }); } @@ -455,14 +472,14 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } }); -// tencentMap.setOnMapClickListener(new TencentMap.OnMapClickListener() { -// @Override -// public void onMapClick(LatLng latLng) { -// Message msg = handler.obtainMessage(0x105); -// msg.obj = obtainTecentLocation(latLng); -// handler.sendMessage(msg); -// } -// }); + tencentMap.setOnMapClickListener(new TencentMap.OnMapClickListener() { + @Override + public void onMapClick(LatLng latLng) { + Message msg = handler.obtainMessage(0x105); + msg.obj = obtainTecentLocation(latLng); + handler.sendMessage(msg); + } + }); tencentMap.addTencentMapGestureListener(new TencentMapGestureListener() { @Override @@ -627,6 +644,10 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic roadLinkEntityList.add(roadMatchEntity); } ); + // 如果当前自动规划打开且没有正在匹配的任务,自动规划下一条最近的任务 + if (imgNaviDistance.isSelected()&&roadMatchEntityList.isEmpty()) { + navi2NearestPoiEntity(); + } } } }); @@ -792,8 +813,6 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic // 语音提示用户 mediaPlayer.start(); systemTTS.playText("拍摄完成"); - // 此时自动规划距离最近的任务路径 - } } @@ -829,66 +848,81 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } /** - * 导航到最近的POIEntity + * 导航到最近的道路任务 * */ @RequiresApi(api = Build.VERSION_CODES.N) private void navi2NearestPoiEntity() { - if (removables == null || removables.isEmpty()) { + if (roadLinkEntityList == null || roadLinkEntityList.isEmpty()) { SystemTTS.getInstance(this).playText("附近当前没有可匹配的任务"); return; } + // RxJava处理,子线程中做后台计算路径规划 Geometry currentGeometry = GeometryTools.createGeometry(new double[]{Constant.currentLocation.getLongitude(), Constant.currentLocation.getLatitude()}); - Removable minRemoveable = removables.stream().filter(new Predicate() { - @Override - public boolean test(Removable removable) { - if (removable instanceof Marker) { - return true; - } - return false; - } - }).min((removable, t1) -> { - Marker marker1 = (Marker) removable; - Marker marker2 = (Marker) t1; - // 判断距离用户当前位置的距离 - JobSearchBean.BodyBean.ListBean bean1 = (JobSearchBean.BodyBean.ListBean) marker1.getTag(); - JobSearchBean.BodyBean.ListBean bean2 = (JobSearchBean.BodyBean.ListBean) marker2.getTag(); - // 转换geo - Geometry geometry1 = GeometryTools.createGeometry(Geohash.getInstance().decode(bean1.getGeo())); - Geometry geometry2 = GeometryTools.createGeometry(Geohash.getInstance().decode(bean2.getGeo())); - if (currentGeometry.distance(geometry1)() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + RoadMatchEntity minRoadLink = roadLinkEntityList.stream() + // 过滤已经匹配到的数据 + .filter(roadMatchEntity -> { + if (roadMatchEntityList.contains(roadMatchEntity)) { + return false; + } + return true; + }) + .min((t1, t2) -> { + // 判断距离用户当前位置的距离 + JobSearchBean.BodyBean.ListBean bean1 = t1.getDataDetail(); + JobSearchBean.BodyBean.ListBean bean2 = t2.getDataDetail(); + // 转换geo + Geometry geometry1 = GeometryTools.createGeometry(Geohash.getInstance().decode(bean1.getGeo())); + Geometry geometry2 = GeometryTools.createGeometry(Geohash.getInstance().decode(bean2.getGeo())); + if (currentGeometry.distance(geometry1)() { @Override - public void selectNaviType(Constant.NAV_TYPE nav_type) { - // 显示导航类型选择的对话框 - Constant.currentNaviType = nav_type; + public void accept(RoadMatchEntity minRoadLink) throws Exception { + JobSearchBean.BodyBean.ListBean bean = minRoadLink.getDataDetail(); + Coordinate endPoint = GeometryTools.createGeometry(Geohash.getInstance().decode(bean.getGeo())).getCoordinates()[0]; + ToastUtils.Message(AutoTakePictureActivity.this, "已为您规划距离最近的任务路径:"+bean.getName()); + // 跳转到对应的导航界面 try { - tencentNaviManager = NaviUtils.getInstance().searchRouteOnly(AutoTakePictureActivity.this, Constant.currentNaviType, new NaviPoi(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), new NaviPoi(endPoint.getY(), endPoint.getX()), routeSearchCallback); + if (Constant.currentNaviType == null) { + NaviUtils.getInstance().selectNaviType(AutoTakePictureActivity.this, new NaviUtils.SelectNaviTypeListener() { + @Override + public void selectNaviType(Constant.NAV_TYPE nav_type) { + // 显示导航类型选择的对话框 + Constant.currentNaviType = nav_type; + try { + tencentNaviManager = NaviUtils.getInstance().searchRouteOnly(AutoTakePictureActivity.this, Constant.currentNaviType, new NaviPoi(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), new NaviPoi(endPoint.getY(), endPoint.getX()), routeSearchCallback); + } catch (Exception e) { + e.printStackTrace(); + com.github.lazylibrary.util.ToastUtils.showToast(AutoTakePictureActivity.this, e.getMessage()); + } + } + }); + } else { + // 已选择导航方式 + tencentNaviManager = NaviUtils.getInstance().searchRouteOnly(AutoTakePictureActivity.this, Constant.currentNaviType, new NaviPoi(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), new NaviPoi(endPoint.getY(), endPoint.getX()), routeSearchCallback); + } } catch (Exception e) { e.printStackTrace(); com.github.lazylibrary.util.ToastUtils.showToast(AutoTakePictureActivity.this, e.getMessage()); } } }); - } else { - // 已选择导航方式 - tencentNaviManager = NaviUtils.getInstance().searchRouteOnly(AutoTakePictureActivity.this, Constant.currentNaviType, new NaviPoi(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), new NaviPoi(endPoint.getY(), endPoint.getX()), routeSearchCallback); - } - } catch (Exception e) { - e.printStackTrace(); - com.github.lazylibrary.util.ToastUtils.showToast(AutoTakePictureActivity.this, e.getMessage()); - } } private TencentNaviManager tencentNaviManager; @@ -900,22 +934,11 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic @Override public void onRouteSearchSuccess(ArrayList arrayList) { - NaviUtils.getInstance().addRoutes(arrayList, tencentMap); - NaviUtils.getInstance().zoomToRoute(arrayList.get(0), tencentMap); - if (tencentNaviManager!=null) { - if (Constant.currentNaviType == Constant.NAV_TYPE.CAR) { - ((TencentCarNaviManager)tencentNaviManager).startNavi(0); - } else if (Constant.currentNaviType == Constant.NAV_TYPE.RIDE) { - - } else { - - } - } + currentNaviLine = drawNaviLine(arrayList.get(0)); } @Override public void onCalcRouteSuccess(CalcRouteResult calcRouteResult) { - } @Override @@ -924,6 +947,118 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } }; + /** + * 绘制导航线路 + * */ + private Polyline drawNaviLine(RouteData routeData) { + if (currentNaviLine!=null) { + currentNaviLine.remove(); + } + Polyline polyline = NaviUtils.getInstance().addRoutes(routeData, tencentMap); + NaviUtils.getInstance().zoomToRoute(AutoTakePictureActivity.this, routeData, tencentMap); + if (tencentNaviManager!=null) { +// if (Constant.currentNaviType == Constant.NAV_TYPE.CAR) { +// } else if (Constant.currentNaviType == Constant.NAV_TYPE.RIDE) { +// +// } else { +// +// } + tencentNaviManager.setNaviCallback(new TencentNaviCallback() { + @Override + public void onStartNavi() { + + } + + @Override + public void onStopNavi() { + polyline.remove(); + } + + @Override + public void onOffRoute() { + + } + + @Override + public void onRecalculateRouteSuccess(int i, ArrayList arrayList) { + } + + @Override + public void onRecalculateRouteSuccessInFence(int i) { + + } + + @Override + public void onRecalculateRouteFailure(int i, int i1, String s) { + + } + + @Override + public void onRecalculateSuccess(CalcRouteResult calcRouteResult) { + + } + + @Override + public void onRecalculateFailure(CalcRouteResult calcRouteResult) { + + } + + @Override + public void onRecalculateRouteStarted(int i) { + + } + + @Override + public void onRecalculateRouteCanceled() { + + } + + @Override + public void onArrivedDestination() { + polyline.remove(); + } + + @Override + public void onPassedWayPoint(int i) { + + } + + @Override + public void onUpdateRoadType(int i) { + + } + + @Override + public void onUpdateParallelRoadStatus(ParallelRoadStatus parallelRoadStatus) { + + } + + @Override + public void onUpdateAttachedLocation(AttachedLocation attachedLocation) { + + } + + @Override + public void onFollowRouteClick(String s, ArrayList arrayList) { + + } + + @Override + public int onVoiceBroadcast(NaviTts naviTts) { + return 0; + } + }); + } + return polyline; + } + + /** + * 清除导航的路线 + * */ + private void clearNaviLine(Polyline polyline) { + polyline.remove(); + } + /** * 初始化领取任务的管理栈 * */ @@ -1568,204 +1703,204 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic // window.setAttributes(lp); } -// private TencentLocation obtainTecentLocation(LatLng latLng) { -// return new TencentLocation() { -// @Override -// public String getProvider() { -// return "NetWork"; -// } -// -// @Override -// public String getFusionProvider() { -// return null; -// } -// -// @Override -// public String getSourceProvider() { -// return null; -// } -// -// @Override -// public double getLatitude() { -// return latLng.getLatitude(); -// } -// -// @Override -// public double getLongitude() { -// return latLng.getLongitude(); -// } -// -// @Override -// public double getAltitude() { -// return latLng.getAltitude(); -// } -// -// @Override -// public float getAccuracy() { -// return 100; -// } -// -// @Override -// public String getName() { -// return "null"; -// } -// -// @Override -// public String getAddress() { -// return "null"; -// } -// -// @Override -// public String getNation() { -// return "null"; -// } -// -// @Override -// public String getProvince() { -// return "null"; -// } -// -// @Override -// public String getCity() { -// return "null"; -// } -// -// @Override -// public String getDistrict() { -// return "null"; -// } -// -// @Override -// public String getTown() { -// return null; -// } -// -// @Override -// public String getVillage() { -// return null; -// } -// -// @Override -// public String getStreet() { -// return null; -// } -// -// @Override -// public String getStreetNo() { -// return null; -// } -// -// @Override -// public Integer getAreaStat() { -// return null; -// } -// -// @Override -// public List getPoiList() { -// return null; -// } -// -// @Override -// public float getBearing() { -// return 0; -// } -// -// @Override -// public float getSpeed() { -// return 0; -// } -// -// @Override -// public long getTime() { -// return 0; -// } -// -// @Override -// public long getElapsedRealtime() { -// return 0; -// } -// -// @Override -// public int getGPSRssi() { -// return 0; -// } -// -// @Override -// public int getInOutStatus() { -// return 0; -// } -// -// @Override -// public String getIndoorBuildingId() { -// return null; -// } -// -// @Override -// public String getIndoorBuildingFloor() { -// return null; -// } -// -// @Override -// public int getIndoorLocationType() { -// return 0; -// } -// -// @Override -// public double getDirection() { -// return 0; -// } -// -// @Override -// public String getCityCode() { -// return null; -// } -// -// @Override -// public String getCityPhoneCode() { -// return null; -// } -// -// @Override -// public TencentMotion getMotion() { -// return null; -// } -// -// @Override -// public int getGpsQuality() { -// return 0; -// } -// -// @Override -// public float getDeltaAngle() { -// return 0; -// } -// -// @Override -// public float getDeltaSpeed() { -// return 0; -// } -// -// @Override -// public int getCoordinateType() { -// return 0; -// } -// -// @Override -// public int getFakeReason() { -// return 0; -// } -// -// @Override -// public int isMockGps() { -// return 0; -// } -// -// @Override -// public Bundle getExtra() { -// return null; -// } -// }; -// } + private TencentLocation obtainTecentLocation(LatLng latLng) { + return new TencentLocation() { + @Override + public String getProvider() { + return "NetWork"; + } + + @Override + public String getFusionProvider() { + return null; + } + + @Override + public String getSourceProvider() { + return null; + } + + @Override + public double getLatitude() { + return latLng.getLatitude(); + } + + @Override + public double getLongitude() { + return latLng.getLongitude(); + } + + @Override + public double getAltitude() { + return latLng.getAltitude(); + } + + @Override + public float getAccuracy() { + return 100; + } + + @Override + public String getName() { + return "null"; + } + + @Override + public String getAddress() { + return "null"; + } + + @Override + public String getNation() { + return "null"; + } + + @Override + public String getProvince() { + return "null"; + } + + @Override + public String getCity() { + return "null"; + } + + @Override + public String getDistrict() { + return "null"; + } + + @Override + public String getTown() { + return null; + } + + @Override + public String getVillage() { + return null; + } + + @Override + public String getStreet() { + return null; + } + + @Override + public String getStreetNo() { + return null; + } + + @Override + public Integer getAreaStat() { + return null; + } + + @Override + public List getPoiList() { + return null; + } + + @Override + public float getBearing() { + return 0; + } + + @Override + public float getSpeed() { + return 0; + } + + @Override + public long getTime() { + return 0; + } + + @Override + public long getElapsedRealtime() { + return 0; + } + + @Override + public int getGPSRssi() { + return 0; + } + + @Override + public int getInOutStatus() { + return 0; + } + + @Override + public String getIndoorBuildingId() { + return null; + } + + @Override + public String getIndoorBuildingFloor() { + return null; + } + + @Override + public int getIndoorLocationType() { + return 0; + } + + @Override + public double getDirection() { + return 0; + } + + @Override + public String getCityCode() { + return null; + } + + @Override + public String getCityPhoneCode() { + return null; + } + + @Override + public TencentMotion getMotion() { + return null; + } + + @Override + public int getGpsQuality() { + return 0; + } + + @Override + public float getDeltaAngle() { + return 0; + } + + @Override + public float getDeltaSpeed() { + return 0; + } + + @Override + public int getCoordinateType() { + return 0; + } + + @Override + public int getFakeReason() { + return 0; + } + + @Override + public int isMockGps() { + return 0; + } + + @Override + public Bundle getExtra() { + return null; + } + }; + } private Handler handler = new Handler(new Handler.Callback() { @Override diff --git a/app/src/main/java/com/navinfo/outdoor/util/FileSpliteMergeUtils.kt b/app/src/main/java/com/navinfo/outdoor/util/FileSpliteMergeUtils.kt index c24c0e0..7bdb3d3 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/FileSpliteMergeUtils.kt +++ b/app/src/main/java/com/navinfo/outdoor/util/FileSpliteMergeUtils.kt @@ -44,7 +44,7 @@ object FileSpliteMergeUtils { val begin = offSet // 如果当前index对应的数据没有超过文件大小,则使用cutSize,否则使用文件实际剩余大小 var end = begin + cutSize - if (totalLength arrayList) { // 添加道路Route到地图,默认选取第一条 - addRoutes(arrayList, tencentMap); - zoomToRoute(arrayList.get(0), tencentMap); + addRoutes(arrayList.get(0), tencentMap); + zoomToRoute(mContext, arrayList.get(0), tencentMap); try { // 自动开始导航 if (Constant.currentNaviType == Constant.NAV_TYPE.CAR) { @@ -536,8 +536,7 @@ public class NaviUtils { } } - public void addRoutes(ArrayList mRouteDatas, TencentMap map) { - RouteData routeData = mRouteDatas.get(0); + public Polyline addRoutes(RouteData routeData, TencentMap map) { ArrayList traffics = getTrafficItemsFromList(routeData.getTrafficIndexList()); List mRoutePoints = routeData.getRoutePoints(); // 点的个数 @@ -578,9 +577,9 @@ public class NaviUtils { map = tencentMap; } Polyline polyline = map.addPolyline(options); - + return polyline; } - public void zoomToRoute(RouteData routeData, TencentMap map) { + public void zoomToRoute(Context mContext, RouteData routeData, TencentMap map) { int marginLeft = mContext.getResources().getDimensionPixelSize(R.dimen.navigation_line_margin_left); int marginTop = mContext.getResources().getDimensionPixelSize(R.dimen.navigation_line_margin_top); int marginRight = mContext.getResources().getDimensionPixelSize(R.dimen.navigation_line_margin_right); diff --git a/app/src/main/res/mipmap-xxhdpi/navigation_distance.png b/app/src/main/res/mipmap-xxhdpi/navigation_distance.png new file mode 100644 index 0000000000000000000000000000000000000000..77c02d48f4f561bc903bd3d2e24314d43ec87348 GIT binary patch literal 5835 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 Vemh(`Fi-#h002ovPDHLkV1kXmAnX7D literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/navigation_distance_disable.png b/app/src/main/res/mipmap-xxhdpi/navigation_distance_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3114dd812ddc79cfe4ea6ce60ab6e51fd81406 GIT binary patch literal 5973 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