| | |
| | | package com.dayu.pipirrapp.fragment; |
| | | |
| | | import static com.dayu.pipirrapp.net.Constants.BASE_URL; |
| | | import static com.dayu.pipirrapp.tool.InspectionUtils.addInspectionLocationData; |
| | | import static com.dayu.pipirrapp.tool.InspectionUtils.updateInspectionLocationData; |
| | | |
| | | import android.content.Context; |
| | | import android.content.Intent; |
| | | import android.content.res.Resources; |
| | | import android.location.LocationManager; |
| | | import android.os.Build; |
| | | import android.os.Bundle; |
| | | import android.text.TextUtils; |
| | | import android.util.Log; |
| | | import android.view.LayoutInflater; |
| | | import android.view.View; |
| | |
| | | import androidx.annotation.Nullable; |
| | | import androidx.lifecycle.Observer; |
| | | |
| | | import com.dayu.pipirrapp.MyApplication; |
| | | import com.dayu.pipirrapp.R; |
| | | import com.dayu.pipirrapp.bean.db.CenterPointBean; |
| | | import com.dayu.pipirrapp.bean.db.InspectionBean; |
| | |
| | | import com.dayu.pipirrapp.bean.db.LatLonBean; |
| | | import com.dayu.pipirrapp.bean.db.MarkerBean; |
| | | 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.LoginResult; |
| | | import com.dayu.pipirrapp.bean.net.MarkerResult; |
| | | import com.dayu.pipirrapp.dao.DaoSingleton; |
| | | import com.dayu.pipirrapp.databinding.FragmentMapBinding; |
| | |
| | | import com.dayu.pipirrapp.utils.ToastUtil; |
| | | import com.dayu.pipirrapp.utils.WebViewUtils; |
| | | import com.dayu.pipirrapp.view.ConfirmDialog; |
| | | import com.dayu.pipirrapp.view.TipUtil; |
| | | import com.hjq.permissions.OnPermissionCallback; |
| | | import com.hjq.permissions.Permission; |
| | | import com.hjq.permissions.XXPermissions; |
| | | import com.jeremyliao.liveeventbus.LiveEventBus; |
| | | import com.tencent.bugly.crashreport.CrashReport; |
| | | |
| | |
| | | int mInspectionState; |
| | | MapFragmenObserver mapFragmenObserver; |
| | | //当前巡检记录的相关信息 |
| | | InspectionBean mInspectionBean; |
| | | public InspectionBean mInspectionBean; |
| | | LatLonBean lastLatLonBean; |
| | | InspectionRequest inspectionRequest; |
| | | volatile boolean isHaseAginData = false; |
| | | volatile boolean webViewIsFinished = false; |
| | | List<InspectionLocationBean> aginShowlocationBeans; |
| | | |
| | | @Override |
| | | public void onAttach(@NonNull Context context) { |
| | |
| | | initView(); |
| | | initLocalData(); |
| | | getMarkerData(); |
| | | //显示巡检状态 |
| | | //显示巡检状态并且显示因意外关闭的历史数据 |
| | | switch (mInspectionState) { |
| | | case InspectionUtils.STAT_INSPECTION: |
| | | case InspectionUtils.PAUSE_INSPECTION: |
| | | InspectionUtils.aginShowLocation(MapFragment.this); |
| | | } |
| | | chageInspecState(mInspectionState); |
| | | return binding.getRoot(); |
| | | } |
| | |
| | | @Override |
| | | public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { |
| | | String url = request.getUrl().toString(); |
| | | Log.i(TAG, "加载地址>>>" + url); |
| | | // 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.i(TAG, "本地缓存>>>" + androidUrl); |
| | | // Log.d(TAG, "本地缓存>>>" + androidUrl); |
| | | // if (MapJpgUtils.getInsatance().validateImageFile(androidUrl,request.)) |
| | | // 判断缓存是否过期 |
| | | // if (!MapJpgUtils.getInsatance(MapFragment.this.getContext()).isCacheExpired(cachedTile)) { |
| | |
| | | // } |
| | | } else { |
| | | //下载瓦片 |
| | | ApiManager.getInstance().donwLoadTile(androidUrl); |
| | | ApiManager.getInstance().donwLoadTile(MapFragment.this.getContext(), androidUrl); |
| | | } |
| | | Log.i(TAG, "在线加载>>>" + url); |
| | | // Log.d(TAG, "在线加载>>>" + url); |
| | | } |
| | | |
| | | |
| | |
| | | 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 -> { |
| | | chageInspecState(InspectionUtils.STAT_INSPECTION); |
| | | if (XXPermissions.isGranted(MapFragment.this.getContext(), Permission.ACCESS_BACKGROUND_LOCATION)) { |
| | | chageInspecState(InspectionUtils.STAT_INSPECTION_ONCLICK); |
| | | } else { |
| | | TipUtil.show(MapFragment.this.getActivity(), "巡检定位需要您选择\"始终允许\"定位信息,否则无法巡检。", new TipUtil.TipListener() { |
| | | @Override |
| | | public void onCancle() { |
| | | getPermissions(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | }); |
| | | //暂停巡检 |
| | | binding.inspectPause.setOnClickListener(v -> { |
| | |
| | | //停止巡检 |
| | | binding.inspectClose.setOnClickListener(v -> { |
| | | chageInspecState(InspectionUtils.STOP_INSPECTION); |
| | | }); |
| | | //上报问题 |
| | | binding.putButton.setOnClickListener(v->{ |
| | | |
| | | }); |
| | | } |
| | | |
| | |
| | | */ |
| | | private void pushLocationData(InspectionLocationBean inspectionLocationBean) { |
| | | inspectionRequest.setInspectId(inspectionLocationBean.getInspectId()); |
| | | inspectionRequest.setInspectorId(inspectionLocationBean.getInspectorId()); |
| | | inspectionRequest.setInspectorId(mInspectionBean.getInspectorId()); |
| | | if (mInspectionBean != null) { |
| | | inspectionRequest.setStartTime(mInspectionBean.getStartTime()); |
| | | inspectionRequest.setStopTime(mInspectionBean.getStopTime()); |
| | | if (!TextUtils.isEmpty(mInspectionBean.getStopTime())) { |
| | | inspectionRequest.setStopTime(mInspectionBean.getStopTime()); |
| | | } |
| | | } |
| | | InspectionRequest.Track track = new InspectionRequest.Track(); |
| | | track.setLat(inspectionLocationBean.getLat()); |
| | |
| | | track.setLocateTime(inspectionLocationBean.getLocateTime()); |
| | | inspectionRequest.getTracks().clear(); |
| | | inspectionRequest.addTracks(track); |
| | | ApiManager.getInstance().requestPostHideLoading(MapFragment.this.getContext(), BASE_URL + "/app/inspect/save", LoginResult.class, inspectionRequest.toMap(inspectionRequest), new SubscriberListener<BaseResponse<LoginResult>>() { |
| | | ApiManager.getInstance().requestPostHideLoading(MapFragment.this.getContext(), BASE_URL + "/app/inspect/save", InsectionResult.class, inspectionRequest.toMap(inspectionRequest), new SubscriberListener<BaseResponse<List<InsectionResult>>>() { |
| | | @Override |
| | | public void onNext(BaseResponse<LoginResult> t) { |
| | | public void onNext(BaseResponse<List<InsectionResult>> t) { |
| | | try { |
| | | if (t.isSuccess()) { |
| | | if (t.getContent() != null) { |
| | | mInspectionBean.setInspectId(String.valueOf(t.getContent().get(0).getInspectId())); |
| | | InspectionUtils.upataInspectionData(MapFragment.this.getContext(), mInspectionBean); |
| | | } |
| | | inspectionLocationBean.setPost(true); |
| | | updateInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean); |
| | | InspectionUtils.updateInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean); |
| | | } else { |
| | | |
| | | } |
| | |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 开始巡检 |
| | | */ |
| | | private void startInspection() { |
| | | DaoSingleton.getAsynchInstance(this.getContext()).inspectionDao().getMostRecentInspectionWithNoStopTime() |
| | | .subscribeOn(Schedulers.io()) |
| | | .observeOn(AndroidSchedulers.mainThread()).subscribe(inspectionBean -> { |
| | | // 更新 UI |
| | | mInspectionBean = inspectionBean; |
| | | }); |
| | | } |
| | | |
| | | |
| | | /** |
| | |
| | | //大于最小距离 |
| | | lastLatLonBean = latLonBean; |
| | | Log.i("chageInspecState", "lat:" + latLonBean.getLatitude() + ",log:" + latLonBean.getLongitude()); |
| | | InspectionLocationBean inspectionLocationBean = createInspectionLocation(latLonBean); |
| | | addInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean); |
| | | InspectionLocationBean inspectionLocationBean = InspectionUtils.createInspectionLocation(latLonBean, mInspectionBean); |
| | | InspectionUtils.addInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean); |
| | | //更新到地图 |
| | | mWebView.evaluateJavascript("javascript:updateInspectionLocation(\"" + latLonBean.getLongitude() + "\",\"" + latLonBean.getLatitude() + "\")", value -> { |
| | | }); |
| | | mWebView.evaluateJavascript("javascript:updateLocation(\"" + latLonBean.getLongitude() + "\",\"" + latLonBean.getLatitude() + "\")", value -> { |
| | | }); |
| | | //上传坐标 |
| | |
| | | } else { |
| | | Log.d(TAG, "isThanMinMeters>>>false"); |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * 创建InspectionLocationBean |
| | | */ |
| | | private InspectionLocationBean createInspectionLocation(LatLonBean latLonBean) { |
| | | InspectionLocationBean inspectionLocationBean = new InspectionLocationBean(); |
| | | inspectionLocationBean.setInspectId(mInspectionBean.getInspectId()); |
| | | inspectionLocationBean.setLocateTime(DateUtils.getNowDateStr()); |
| | | inspectionLocationBean.setPost(false); |
| | | inspectionLocationBean.setInspectorId(MyApplication.myApplication.userId); |
| | | inspectionLocationBean.setLng(String.valueOf(latLonBean.getLongitude())); |
| | | inspectionLocationBean.setLat(String.valueOf(latLonBean.getLatitude())); |
| | | return inspectionLocationBean; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 修改巡检状态 |
| | | * |
| | | * @param inspectionState |
| | | */ |
| | | private void chageInspecState(int inspectionState) { |
| | | Intent location = new Intent(this.getActivity(), MyLocationService.class); |
| | | location.putExtra("isSingle", false); |
| | | //0没有开始,1开始,2暂停,3关闭 |
| | | switch (inspectionState) { |
| | | case 0: |
| | | case InspectionUtils.NO_INSPECTION: |
| | | binding.inspectButton.setVisibility(View.VISIBLE); |
| | | binding.inspectRL.setVisibility(View.GONE); |
| | | binding.inspectButton.setText("巡"); |
| | |
| | | //关闭定位 |
| | | this.getActivity().stopService(location); |
| | | break; |
| | | case 1: |
| | | case InspectionUtils.STAT_INSPECTION_ONCLICK: |
| | | //添加新的巡检记录 |
| | | startInspection(); |
| | | //获取定位服务传过来的坐标点 |
| | | LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver); |
| | | binding.inspectRL.setVisibility(View.VISIBLE); |
| | | binding.inspectButton.setVisibility(View.GONE); |
| | | binding.inspectPause.setText("暂停"); |
| | | binding.stateText.setText("已开启巡检"); |
| | | binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.base_blue)); |
| | | //开启定位 |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
| | | this.getActivity().startForegroundService(location); |
| | | } else { |
| | | this.getActivity().startService(location); |
| | | } |
| | | mInspectionBean = InspectionUtils.startInspection(this.getContext()); |
| | | inspectionRequest = new InspectionRequest(); |
| | | startLocation(location); |
| | | break; |
| | | case 2://暂停 |
| | | case InspectionUtils.STAT_INSPECTION://1开始 |
| | | |
| | | LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver); |
| | | //关闭定位 |
| | | this.getActivity().stopService(location); |
| | | binding.stateText.setText("已暂停巡检"); |
| | | binding.inspectPause.setText("继续"); |
| | | binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.inspect_rl_bg_color)); |
| | | startLocation(location); |
| | | break; |
| | | case 3: |
| | | case InspectionUtils.PAUSE_INSPECTION://暂停 |
| | | try { |
| | | //关闭定位 |
| | | this.getActivity().stopService(location); |
| | | binding.stateText.setText("已暂停巡检"); |
| | | binding.inspectPause.setText("继续"); |
| | | binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.inspect_rl_bg_color)); |
| | | SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.PAUSE_INSPECTION); |
| | | //清除地图巡检轨迹 |
| | | mWebView.evaluateJavascript("javascript:cleanLoclLay()", value -> { |
| | | }); |
| | | } catch (Resources.NotFoundException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | break; |
| | | case InspectionUtils.STOP_INSPECTION://关闭 |
| | | ConfirmDialog confirmDialog = new ConfirmDialog(MapFragment.this.getActivity(), "提示", "确认关闭巡检吗?", new ConfirmDialog.ConfirmOnClickListener() { |
| | | @Override |
| | | public void onClick(ConfirmDialog confirmDialog, View v) { |
| | | confirmDialog.dismiss(); |
| | | chageInspecState(InspectionUtils.NO_INSPECTION); |
| | | SharedPreferencesHelper.getInstance(MapFragment.this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.NO_INSPECTION); |
| | | //有可能还没获取到定位信息就结束巡检了 |
| | | if (lastLatLonBean != null) { |
| | | //更新本地数据库结束时间 |
| | | mInspectionBean.setStopTime(DateUtils.getNowDateStr()); |
| | | InspectionUtils.upataInspectionData(MapFragment.this.getContext(), mInspectionBean); |
| | | //上报结束时间 |
| | | InspectionLocationBean inspectionLocationBean = InspectionUtils.createInspectionLocation(lastLatLonBean, mInspectionBean); |
| | | InspectionUtils.addInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean); |
| | | pushLocationData(inspectionLocationBean); |
| | | mInspectionBean = new InspectionBean(); |
| | | //清除地图巡检轨迹 |
| | | mWebView.evaluateJavascript("javascript:cleanLocationLay()", value -> { |
| | | }); |
| | | lastLatLonBean = null; |
| | | } |
| | | } |
| | | }); |
| | | confirmDialog.show(); |
| | |
| | | default: |
| | | } |
| | | mInspectionState = inspectionState; |
| | | } |
| | | |
| | | /** |
| | | * 意外退出后继续显示之前的坐标 |
| | | */ |
| | | public void aginShowLocation(List<InspectionLocationBean> locationBeans) { |
| | | isHaseAginData = true; |
| | | if (locationBeans != null) { |
| | | aginShowlocationBeans = locationBeans; |
| | | } |
| | | if (webViewIsFinished) { |
| | | if (aginShowlocationBeans != null) { |
| | | for (InspectionLocationBean inspectionLocationBean : aginShowlocationBeans) { |
| | | Log.i("mWebView", "aginShowLocation" + inspectionLocationBean.getLng() + "\",\"" + inspectionLocationBean.getLat()); |
| | | mWebView.evaluateJavascript("javascript:aginShowLocation(\"" + inspectionLocationBean.getLng() + "\",\"" + inspectionLocationBean.getLat() + "\")", value -> { |
| | | }); |
| | | } |
| | | // 向 WebView 注入数据 |
| | | |
| | | aginShowlocationBeans.clear(); |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 开始巡检的相关逻辑 |
| | | * |
| | | * @param location |
| | | */ |
| | | private void startLocation(Intent location) { |
| | | //获取定位服务传过来的坐标点 |
| | | LiveEventBus.get(CommonKeyName.locationData).observeForever(locationObserver); |
| | | binding.inspectRL.setVisibility(View.VISIBLE); |
| | | binding.inspectButton.setVisibility(View.GONE); |
| | | binding.inspectPause.setText("暂停"); |
| | | binding.stateText.setText("已开启巡检"); |
| | | binding.inspectRL.setBackgroundColor(this.getContext().getResources().getColor(R.color.base_blue)); |
| | | //开启定位 |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
| | | this.getActivity().startForegroundService(location); |
| | | } else { |
| | | this.getActivity().startService(location); |
| | | } |
| | | inspectionRequest = new InspectionRequest(); |
| | | SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.STAT_INSPECTION); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 申请后台定位权限 |
| | | */ |
| | | private void getPermissions() { |
| | | try { |
| | | XXPermissions.with(MapFragment.this.getContext()) |
| | | // 申请多个权限 |
| | | .permission(Permission.ACCESS_BACKGROUND_LOCATION) |
| | | .request(new OnPermissionCallback() { |
| | | |
| | | @Override |
| | | public void onGranted(@NonNull List<String> permissions, boolean allGranted) { |
| | | if (allGranted) { |
| | | chageInspecState(InspectionUtils.STAT_INSPECTION_ONCLICK); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) { |
| | | if (doNotAskAgain) { |
| | | // 如果是被永久拒绝就跳转到应用权限系统设置页面 |
| | | TipUtil.show(MapFragment.this.getActivity(), "被永久拒绝授权,请手动授予定位始终允许权限!选择“权限”-->“位置信息”-->“始终允许”,然后返回应用。", new TipUtil.TipListener() { |
| | | @Override |
| | | public void onCancle() { |
| | | XXPermissions.startPermissionActivity(MapFragment.this.getContext(), permissions); |
| | | } |
| | | }); |
| | | } else { |
| | | ToastUtil.showToastLong(MapFragment.this.getContext(), "获取定位始终允许权限失败"); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | } catch (Throwable e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |