| | |
| | | import com.dayu.pipirrapp.bean.net.CenterPointResult; |
| | | import com.dayu.pipirrapp.bean.net.InsectionResult; |
| | | import com.dayu.pipirrapp.bean.net.InspectionRequest; |
| | | import com.dayu.pipirrapp.bean.net.MarkerListResult; |
| | | import com.dayu.pipirrapp.bean.net.MarkerResult; |
| | | import com.dayu.pipirrapp.dao.DaoSingleton; |
| | | import com.dayu.pipirrapp.databinding.FragmentMapBinding; |
| | | import com.dayu.pipirrapp.js.MyWebViewInterface; |
| | | import com.dayu.pipirrapp.tool.MyWebViewInterface; |
| | | import com.dayu.pipirrapp.net.ApiManager; |
| | | import com.dayu.pipirrapp.net.BaseResponse; |
| | | import com.dayu.pipirrapp.net.Constants; |
| | | import com.dayu.pipirrapp.net.subscribers.SubscriberListener; |
| | | import com.dayu.pipirrapp.observer.MapFragmenObserver; |
| | | import com.dayu.pipirrapp.tool.InspectionUtils; |
| | | import com.dayu.pipirrapp.tool.MarkerUtils; |
| | | import com.dayu.pipirrapp.utils.CommonData; |
| | | import com.dayu.pipirrapp.utils.CommonKeyName; |
| | | import com.dayu.pipirrapp.utils.DateUtils; |
| | |
| | | import java.io.FileInputStream; |
| | | import java.io.FileNotFoundException; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Random; |
| | | import java.util.Map; |
| | | |
| | | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; |
| | | import io.reactivex.rxjava3.schedulers.Schedulers; |
| | |
| | | |
| | | WebView mWebView; |
| | | CenterPointBean centerPointBean; |
| | | String strMarkerJson; |
| | | //当前巡检状态 |
| | | int mInspectionState; |
| | | MapFragmenObserver mapFragmenObserver; |
| | |
| | | public InspectionBean mInspectionBean; |
| | | LatLonBean lastLatLonBean; |
| | | InspectionRequest inspectionRequest; |
| | | volatile boolean isHaseAginData = false; |
| | | // volatile boolean isHaseAginData = false; |
| | | //web是否加载完成 |
| | | volatile boolean webViewIsFinished = false; |
| | | List<InspectionLocationBean> aginShowlocationBeans; |
| | | //web加载时网页还没加载完时的数据 |
| | | List<MarkerBean> webNoFinishMarkerData = new ArrayList<>(); |
| | | //所有的Marker数据键为marker的Id |
| | | Map<String, MarkerBean> markerBeanSet = new HashMap<>(); |
| | | |
| | | @Override |
| | | public void onAttach(@NonNull Context context) { |
| | |
| | | mWebView.loadUrl("file:///android_asset/index.html"); |
| | | getCenterPoint(); |
| | | initView(); |
| | | initLocalData(); |
| | | initWeb(); |
| | | getMarkerData(); |
| | | //显示巡检状态并且显示因意外关闭的历史数据 |
| | | switch (mInspectionState) { |
| | | case InspectionUtils.STAT_INSPECTION: |
| | | case InspectionUtils.PAUSE_INSPECTION: |
| | | InspectionUtils.aginShowLocation(MapFragment.this); |
| | | } |
| | | |
| | | chageInspecState(mInspectionState); |
| | | return binding.getRoot(); |
| | | } |
| | | |
| | | private void initWeb() { |
| | | mWebView.setWebViewClient(new WebViewClient() { |
| | | @Override |
| | | public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { |
| | | String url = request.getUrl().toString(); |
| | | //判断当前是否为加载瓦片 |
| | | if (MapJpgUtils.getInsatance().isTianDiTuTileRequest(url)) { |
| | | String androidUrl = url.replace(CommonData.webKey, CommonData.androidKey); |
| | | // 检查本地缓存 |
| | | File cachedTile = MapJpgUtils.getInsatance().getCachedTile(androidUrl); |
| | | if (cachedTile != null && cachedTile.exists()) { |
| | | // Log.d(TAG, "本地缓存>>>" + androidUrl); |
| | | // if (MapJpgUtils.getInsatance().validateImageFile(androidUrl,request.)) |
| | | // 判断缓存是否过期 |
| | | // if (!MapJpgUtils.getInsatance(MapFragment.this.getContext()).isCacheExpired(cachedTile)) { |
| | | try { |
| | | // 从缓存加载瓦片 |
| | | return new WebResourceResponse("image/jpg", "utf-8", new FileInputStream(cachedTile)); |
| | | } catch (FileNotFoundException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | // } |
| | | } else { |
| | | //下载瓦片 |
| | | ApiManager.getInstance().donwLoadTile(MapFragment.this.getContext(), androidUrl); |
| | | } |
| | | |
| | | /** |
| | | * 初始化各个状态 |
| | | */ |
| | | private void initState() { |
| | | //开启定位 |
| | | } |
| | | |
| | | |
| | | return super.shouldInterceptRequest(view, request); |
| | | } |
| | | |
| | | @Override |
| | | public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { |
| | | super.onReceivedError(view, request, error); |
| | | // 捕获加载过程中发生的错误 |
| | | int errorCode = error.getErrorCode(); |
| | | String description = error.getDescription().toString(); |
| | | String failingUrl = request.getUrl().toString(); |
| | | Log.e("setWebViewClient", "errorCode:" + errorCode + ">>>>description:" + description + ">>>>failingUrl:" + failingUrl); |
| | | // 处理错误,例如显示错误页面或提示用户 |
| | | } |
| | | |
| | | @Override |
| | | public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { |
| | | super.onReceivedHttpError(view, request, errorResponse); |
| | | // 捕获HTTP错误(如404, 500等) |
| | | int statusCode = errorResponse.getStatusCode(); |
| | | String description = errorResponse.getReasonPhrase(); |
| | | Log.e("setWebViewClient", "statusCode:" + statusCode + ">>>>description:" + description); |
| | | // 根据HTTP状态码处理错误 |
| | | } |
| | | |
| | | @Override |
| | | public void onPageFinished(WebView view, String url) { |
| | | super.onPageFinished(view, url); |
| | | //页面加载完成 |
| | | webViewIsFinished = true; |
| | | initLocalData(); |
| | | aginShowLocation(null); |
| | | |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 初始化本地数据 |
| | | */ |
| | | public void initLocalData() { |
| | | //跳转中心点 |
| | | centerPointBean = DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().findFirst(); |
| | | List<MarkerBean> markerBeans = DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().findAll(); |
| | | strMarkerJson = WebViewUtils.beanToJson(markerBeans); |
| | | jumpCenterPoint(); |
| | | setMapMarker(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 跳转地图中心点 |
| | | */ |
| | | public void jumpCenterPoint() { |
| | | if (centerPointBean != null) { |
| | | Log.d(TAG, "jumpCenterPoint>>>>>>>>>>>>>>>>>>>" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat()); |
| | | mWebView.evaluateJavascript("javascript:setCenterAndZoom(\"" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat() + "\",\"" + centerPointBean.getZoomMp() + "\")", value -> { |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 添加标注点 |
| | | */ |
| | | public void setMapMarker() { |
| | | Log.i("mWebView", "addMarker????????????" + strMarkerJson); |
| | | mWebView.evaluateJavascript("javascript:addMarker(\"" + strMarkerJson + "\")", new ValueCallback<String>() { |
| | | @Override |
| | | public void onReceiveValue(String value) { |
| | | Log.i("mWebView", "addMarker!!!!!!!!!" + value); |
| | | //添加因webview没有加载完成导致没有添加的地图标注 |
| | | if (!webNoFinishMarkerData.isEmpty()) { |
| | | for (MarkerBean bean : webNoFinishMarkerData) { |
| | | setMapMarker(bean); |
| | | } |
| | | }); |
| | | } |
| | | //显示所有取水口 |
| | | MarkerUtils.showLocoMarks(MapFragment.this); |
| | | //显示巡检状态并且显示因意外关闭的历史数据 |
| | | switch (mInspectionState) { |
| | | case InspectionUtils.STAT_INSPECTION: |
| | | case InspectionUtils.PAUSE_INSPECTION: |
| | | InspectionUtils.aginShowLocation(MapFragment.this); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | * 获取取水口列表 |
| | | */ |
| | | private void getMarkerData() { |
| | | ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/project/intake/all", MarkerResult.class, null, new SubscriberListener<BaseResponse<MarkerResult>>() { |
| | | ApiManager.getInstance().requestGetHideLoading(this.getContext(), Constants.BASE_URL + "/project/intake/all", MarkerListResult.class, null, new SubscriberListener<BaseResponse<MarkerListResult>>() { |
| | | @Override |
| | | public void onNext(BaseResponse<MarkerResult> t) { |
| | | public void onNext(BaseResponse<MarkerListResult> t) { |
| | | if (t.isSuccess()) { |
| | | if (t.isSuccess()) { |
| | | if (t.getContent().getObj() != null && !t.getContent().getObj().isEmpty()) { |
| | | List<MarkerBean> markerBeans = new ArrayList<>(); |
| | | for (int i = 0; i < t.getContent().getObj().size(); i++) { |
| | | MarkerResult.Obj result = t.getContent().getObj().get(i); |
| | | MarkerResult result = t.getContent().getObj().get(i); |
| | | //保存数据 |
| | | MarkerBean markerBean = new MarkerBean(); |
| | | markerBean.setId(result.getId()); |
| | | markerBean.setLng(result.getLng()); |
| | | markerBean.setLat(result.getLat()); |
| | | markerBean.setBlockId(result.getBlockId()); |
| | |
| | | markerBean.setTownId(result.getTownId()); |
| | | markerBean.setVillageId(result.getVillageId()); |
| | | markerBean.setCountyId(result.getCountyId()); |
| | | markerBean.setAddress(result.getAddress()); |
| | | markerBean.setBlockName(result.getBlockName()); |
| | | markerBeans.add(markerBean); |
| | | setMapMarker(markerBean); |
| | | } |
| | | strMarkerJson = WebViewUtils.beanToJson(markerBeans); |
| | | setMapMarker(); |
| | | DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().deleteAll(); |
| | | // 使用 RxJava 异步插入数据 |
| | | DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll(markerBeans) |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 添加标注点 |
| | | */ |
| | | public void addMarker() { |
| | | Random random = new Random(); |
| | | StringBuilder stringBuilder = new StringBuilder(); |
| | | stringBuilder.append("["); |
| | | |
| | | // 中国经纬度范围 |
| | | double minLongitude = 73.43; |
| | | double maxLongitude = 135.05; |
| | | double minLatitude = 3.52; |
| | | double maxLatitude = 53.57; |
| | | |
| | | for (int i = 0; i < 1000; i++) { |
| | | stringBuilder.append("["); |
| | | // 生成随机经度 |
| | | double longitude = minLongitude + (maxLongitude - minLongitude) * random.nextDouble(); |
| | | stringBuilder.append(longitude); |
| | | stringBuilder.append(","); |
| | | // 生成随机纬度 |
| | | double latitude = minLatitude + (maxLatitude - minLatitude) * random.nextDouble(); |
| | | stringBuilder.append(latitude); |
| | | stringBuilder.append(",\"237取水口\"],"); |
| | | } |
| | | stringBuilder.append("[116.417854,39.921988,\"235取水口\"]]"); |
| | | String jsonData = stringBuilder.toString().replace("\\", "\\\\").replace("\"", "\\\""); |
| | | Log.i("mWebView", "addMarker????????????" + jsonData); |
| | | mWebView.evaluateJavascript("javascript:addMarker(\"" + jsonData + "\")", new ValueCallback<String>() { |
| | | @Override |
| | | public void onReceiveValue(String value) { |
| | | Log.i("mWebView", "addMarker!!!!!!!!!" + value); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | void initView() { |
| | | |
| | | mWebView.setWebViewClient(new WebViewClient() { |
| | | @Override |
| | | public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { |
| | | String url = request.getUrl().toString(); |
| | | // Log.d(TAG, "加载地址>>>" + url); |
| | | //判断当前是否为加载瓦片 |
| | | if (MapJpgUtils.getInsatance().isTianDiTuTileRequest(url)) { |
| | | String androidUrl = url.replace(CommonData.webKey, CommonData.androidKey); |
| | | // 检查本地缓存 |
| | | File cachedTile = MapJpgUtils.getInsatance().getCachedTile(androidUrl); |
| | | if (cachedTile != null && cachedTile.exists()) { |
| | | // Log.d(TAG, "本地缓存>>>" + androidUrl); |
| | | // if (MapJpgUtils.getInsatance().validateImageFile(androidUrl,request.)) |
| | | // 判断缓存是否过期 |
| | | // if (!MapJpgUtils.getInsatance(MapFragment.this.getContext()).isCacheExpired(cachedTile)) { |
| | | try { |
| | | // 从缓存加载瓦片 |
| | | return new WebResourceResponse("image/jpg", "utf-8", new FileInputStream(cachedTile)); |
| | | } catch (FileNotFoundException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | // } |
| | | } else { |
| | | //下载瓦片 |
| | | ApiManager.getInstance().donwLoadTile(MapFragment.this.getContext(), androidUrl); |
| | | } |
| | | // Log.d(TAG, "在线加载>>>" + url); |
| | | } |
| | | |
| | | |
| | | return super.shouldInterceptRequest(view, request); |
| | | } |
| | | |
| | | @Override |
| | | public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { |
| | | super.onReceivedError(view, request, error); |
| | | // 捕获加载过程中发生的错误 |
| | | int errorCode = error.getErrorCode(); |
| | | String description = error.getDescription().toString(); |
| | | String failingUrl = request.getUrl().toString(); |
| | | Log.e("setWebViewClient", "errorCode:" + errorCode + ">>>>description:" + description + ">>>>failingUrl:" + failingUrl); |
| | | // 处理错误,例如显示错误页面或提示用户 |
| | | // view.loadUrl("file:///android_asset/error.html"); |
| | | } |
| | | |
| | | @Override |
| | | public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { |
| | | super.onReceivedHttpError(view, request, errorResponse); |
| | | // 捕获HTTP错误(如404, 500等) |
| | | int statusCode = errorResponse.getStatusCode(); |
| | | String description = errorResponse.getReasonPhrase(); |
| | | Log.e("setWebViewClient", "statusCode:" + statusCode + ">>>>description:" + description); |
| | | // 根据HTTP状态码处理错误 |
| | | } |
| | | |
| | | @Override |
| | | public void onPageFinished(WebView view, String url) { |
| | | super.onPageFinished(view, url); |
| | | webViewIsFinished = true; |
| | | //页面加载完成 |
| | | if (isHaseAginData) { |
| | | aginShowLocation(null); |
| | | } |
| | | } |
| | | }); |
| | | //巡检按钮 |
| | | binding.inspectButton.setOnClickListener(v -> { |
| | | if (XXPermissions.isGranted(MapFragment.this.getContext(), Permission.ACCESS_BACKGROUND_LOCATION)) { |
| | |
| | | Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class); |
| | | MapFragment.this.getActivity().startActivity(issue); |
| | | }); |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 显示取水口详情 |
| | | * |
| | | * @param data |
| | | */ |
| | | public void showWaterIntakeDetail(String data) { |
| | | MyLog.i(data); |
| | | binding.bottomLL.setVisibility(View.VISIBLE); |
| | | MarkerBean markerBean = markerBeanSet.get(data); |
| | | if (markerBean != null) { |
| | | binding.bottomLL.setVisibility(View.VISIBLE); |
| | | binding.markerAddress.setText(markerBean.getAddress()); |
| | | binding.markerName.setText(markerBean.getName()); |
| | | binding.markerBlockName.setText(markerBean.getBlockName()); |
| | | binding.lat.setText(markerBean.getLat()); |
| | | binding.lng.setText(markerBean.getLng()); |
| | | binding.editePoint.setOnClickListener(v -> { |
| | | mWebView.evaluateJavascript("javascript:showPin()", value -> { |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | * 获取地图中心点 |
| | | */ |
| | | private void getCenterPoint() { |
| | | |
| | | ApiManager.getInstance().requestGet(this.getContext(), Constants.BASE_URL + "/base/dict_item/map_center", CenterPointResult.class, null, new SubscriberListener<BaseResponse<CenterPointResult>>() { |
| | | @Override |
| | | public void onNext(BaseResponse<CenterPointResult> t) { |
| | |
| | | * 意外退出后继续显示之前的坐标 |
| | | */ |
| | | public void aginShowLocation(List<InspectionLocationBean> locationBeans) { |
| | | isHaseAginData = true; |
| | | if (locationBeans != null) { |
| | | aginShowlocationBeans = locationBeans; |
| | | } |
| | |
| | | }); |
| | | } |
| | | // 向 WebView 注入数据 |
| | | |
| | | aginShowlocationBeans.clear(); |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 跳转地图中心点 |
| | | */ |
| | | public void jumpCenterPoint() { |
| | | if (webViewIsFinished) { |
| | | if (centerPointBean != null) { |
| | | Log.d(TAG, "jumpCenterPoint>>>>>>>>>>>>>>>>>>>" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat()); |
| | | mWebView.evaluateJavascript("javascript:setCenterAndZoom(\"" + centerPointBean.getLng() + "\",\"" + centerPointBean.getLat() + "\",\"" + centerPointBean.getZoomMp() + "\")", value -> { |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 添加标注点 |
| | | */ |
| | | public void setMapMarker(MarkerBean markerBean) { |
| | | if (markerBean != null) { |
| | | if (webViewIsFinished) { |
| | | Log.i("mWebView", "addMarker????????????"); |
| | | mWebView.evaluateJavascript("javascript:addMarker(\"" + markerBean.getId() + "\",\"" + markerBean.getLng() + "\",\"" + markerBean.getLat() + "\",\"" + markerBean.getName() + "\")", new ValueCallback<String>() { |
| | | @Override |
| | | public void onReceiveValue(String value) { |
| | | } |
| | | }); |
| | | markerBeanSet.put(markerBean.getId(), markerBean); |
| | | |
| | | } else { |
| | | webNoFinishMarkerData.add(markerBean); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 开始巡检的相关逻辑 |
| | | * |
| | | * @param |