| | |
| | | package com.dayu.pipirrapp.fragment; |
| | | |
| | | import static com.dayu.pipirrapp.net.Constants.BASE_URL; |
| | | |
| | | import android.content.Context; |
| | | import android.content.Intent; |
| | | import android.location.LocationManager; |
| | | import android.content.res.Resources; |
| | | import android.os.Bundle; |
| | | import android.os.Handler; |
| | | import android.os.Looper; |
| | | import android.text.TextUtils; |
| | | import android.util.Log; |
| | | import android.view.LayoutInflater; |
| | | import android.view.View; |
| | | import android.view.ViewGroup; |
| | | import android.webkit.JsResult; |
| | | import android.webkit.WebChromeClient; |
| | | import android.webkit.WebSettings; |
| | | import android.webkit.ValueCallback; |
| | | import android.webkit.WebResourceError; |
| | | import android.webkit.WebResourceRequest; |
| | | import android.webkit.WebResourceResponse; |
| | | import android.webkit.WebView; |
| | | import android.webkit.WebViewClient; |
| | | |
| | | import androidx.annotation.NonNull; |
| | | import androidx.annotation.Nullable; |
| | | import androidx.lifecycle.DefaultLifecycleObserver; |
| | | import androidx.lifecycle.LifecycleOwner; |
| | | import androidx.lifecycle.Observer; |
| | | |
| | | import com.dayu.pipirrapp.R; |
| | | import com.dayu.pipirrapp.activity.AddIssueActivity; |
| | | import com.dayu.pipirrapp.bean.db.CenterPointBean; |
| | | import com.dayu.pipirrapp.bean.db.InspectionBean; |
| | | import com.dayu.pipirrapp.bean.db.InspectionLocationBean; |
| | | 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.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.service.MyLocationService; |
| | | 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 com.dayu.pipirrapp.utils.MapJpgUtils; |
| | | import com.dayu.pipirrapp.utils.MyLog; |
| | | import com.dayu.pipirrapp.utils.ServiceUtils; |
| | | import com.dayu.pipirrapp.utils.SharedPreferencesHelper; |
| | | 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; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.FileNotFoundException; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; |
| | | import io.reactivex.rxjava3.schedulers.Schedulers; |
| | | |
| | | /** |
| | | * author: zuo |
| | |
| | | * 备注:地图页 |
| | | */ |
| | | public class MapFragment extends BaseFragment { |
| | | static String TAG = "MapFragment"; |
| | | |
| | | FragmentMapBinding binding; |
| | | LocationManager locationManager; |
| | | |
| | | WebView mWebView; |
| | | CenterPointBean centerPointBean; |
| | | //当前巡检状态 |
| | | int mInspectionState; |
| | | MapFragmenObserver mapFragmenObserver; |
| | | //当前巡检记录的相关信息 |
| | | public InspectionBean mInspectionBean; |
| | | LatLonBean lastLatLonBean; |
| | | InspectionRequest inspectionRequest; |
| | | // volatile boolean isHaseAginData = false; |
| | | 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) { |
| | | super.onAttach(context); |
| | | requireActivity().getLifecycle().addObserver(new MapFragmenObserver()); |
| | | Log.i(TAG, "onAttach"); |
| | | mapFragmenObserver = new MapFragmenObserver(); |
| | | requireActivity().getLifecycle().addObserver(mapFragmenObserver); |
| | | } |
| | | |
| | | @Override |
| | | public void onCreate(@Nullable Bundle savedInstanceState) { |
| | | super.onCreate(savedInstanceState); |
| | | Log.i(TAG, "onCreate"); |
| | | mInspectionState = SharedPreferencesHelper.getInstance(this.getContext()).get(CommonKeyName.inspectionState, 0); |
| | | } |
| | | |
| | | @Override |
| | | public void onStart() { |
| | | super.onStart(); |
| | | Log.i(TAG, "onStart"); |
| | | } |
| | | |
| | | |
| | | @Nullable |
| | | @Override |
| | | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { |
| | | |
| | | binding = FragmentMapBinding.inflate(inflater, container, false); |
| | | mapFragmenObserver.setmWebView(binding.webView); |
| | | Log.i("MapFragment", "onCreateView"); |
| | | mWebView = binding.webView; |
| | | initWebView(); |
| | | mWebView.loadUrl("http://192.168.3.178:3000/"); |
| | | mWebView = WebViewUtils.initWebView(mWebView); |
| | | MyWebViewInterface myWebViewInterface = new MyWebViewInterface(MapFragment.this); |
| | | mWebView.addJavascriptInterface(myWebViewInterface, "Android"); |
| | | mWebView.loadUrl("file:///android_asset/index.html"); |
| | | getCenterPoint(); |
| | | initView(); |
| | | //开启定位 |
| | | Intent location = new Intent(this.getActivity(), MyLocationService.class); |
| | | location.putExtra("isSingle", false); |
| | | this.getActivity().startService(location); |
| | | |
| | | getMarkerData(); |
| | | |
| | | chageInspecState(mInspectionState); |
| | | return binding.getRoot(); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public void onResume() { |
| | | super.onResume(); |
| | | mWebView.onResume(); // 恢复 WebView,能正常执行网页的响应 |
| | | /** |
| | | * 初始化各个状态 |
| | | */ |
| | | private void initState() { |
| | | //开启定位 |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void onPause() { |
| | | super.onPause(); |
| | | mWebView.onPause(); // 通过 onPause 动作通知内核暂停所有的动作,如 DOM 的解析、plugin 的执行、JavaScript 执行等 |
| | | } |
| | | |
| | | @Override |
| | | public void onDestroy() { |
| | | super.onDestroy(); |
| | | ((ViewGroup) mWebView.getParent()).removeView(mWebView); |
| | | mWebView.destroy(); // 当 Activity 要 destroy 时,应先将 WebView 移除,再 destroy 掉 |
| | | } |
| | | |
| | | void initWebView() { |
| | | // getActivity().getWindow().setFlags( |
| | | // WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, |
| | | // WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); |
| | | // WebView 配置 |
| | | WebSettings webSettings = mWebView.getSettings(); |
| | | // 生命周期 |
| | | // 前进后退 |
| | | if (mWebView.canGoBack()) { |
| | | mWebView.goBack(); |
| | | } |
| | | if (mWebView.canGoForward()) { |
| | | mWebView.goForward(); |
| | | } |
| | | // 缓存相关 |
| | | mWebView.clearCache(false); // 清除缓存 |
| | | // mWebView.clearHistory(); // 清除历史 |
| | | // mWebView.clearFormData(); // 清除表单数据 |
| | | webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);// 设置缓存模式 |
| | | webSettings.setDatabaseEnabled(true); |
| | | webSettings.setDomStorageEnabled(true);//开启DOM缓存,关闭的话H5自身的一些操作是无效的 |
| | | // 缓存模式 |
| | | // LOAD_DEFAULT: 默认,根据 cache-control 决定是否从网络上取数据 |
| | | // LOAD_NORMAL: API level 17 中已经废弃, 从API level 11开始作用同 LOAD_DEFAULT 模式 |
| | | // LOAD_CACHE_ELSE_NETWORK: 只要本地有,无论是否过期,或者 no-cache,都使用缓存中的数据 |
| | | // LOAD_NO_CACHE: 不使用缓存,只从网络获取数据 |
| | | // LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 |
| | | // js 相关 |
| | | webSettings.setJavaScriptEnabled(true); // 支持 js。如果碰到后台无法释放 js 导致耗电,应在 onStop 和 onResume 里分别设成 false 和 true |
| | | // mWebView.addJavascriptInterface(new WebAppInterface(this), "android"); // js 接口 |
| | | |
| | | // webSettings.setPluginsEnabled(true); // 支持插件 |
| | | // 设置自适应屏幕,两者合用 |
| | | webSettings.setUseWideViewPort(true); // 将图片调整到适合 WebView 的大小 |
| | | webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小 |
| | | // 缩放操作 |
| | | webSettings.setSupportZoom(true); // 支持缩放,默认为 true |
| | | webSettings.setBuiltInZoomControls(true); // 设置内置的缩放控件,若为 false,则该 WebView 不可缩放 |
| | | webSettings.setDisplayZoomControls(false); // 隐藏原生的缩放控件 |
| | | webSettings.setLoadsImagesAutomatically(true);//预加载 |
| | | //webView弹JsAlert |
| | | mWebView.setWebChromeClient(new WebChromeClient() { |
| | | @Override |
| | | public boolean onJsAlert(WebView view, String url, String message, JsResult result) { |
| | | return super.onJsAlert(view, url, message, result); |
| | | /** |
| | | * 初始化本地数据 |
| | | */ |
| | | public void initLocalData() { |
| | | //跳转中心点 |
| | | centerPointBean = DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().findFirst(); |
| | | jumpCenterPoint(); |
| | | //添加因webview没有加载完成导致没有添加的地图标注 |
| | | if (!webNoFinishMarkerData.isEmpty()) { |
| | | for (MarkerBean bean : webNoFinishMarkerData) { |
| | | setMapMarker(bean); |
| | | } |
| | | }); |
| | | MyWebViewInterface myWebViewInterface=new MyWebViewInterface(this); |
| | | mWebView.addJavascriptInterface(myWebViewInterface,"Android"); |
| | | } |
| | | //显示所有取水口 |
| | | 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>>() { |
| | | @Override |
| | | public void onNext(BaseResponse<MarkerResult> 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); |
| | | //保存数据 |
| | | MarkerBean markerBean = new MarkerBean(); |
| | | markerBean.setId(result.getId()); |
| | | markerBean.setLng(result.getLng()); |
| | | markerBean.setLat(result.getLat()); |
| | | markerBean.setBlockId(result.getBlockId()); |
| | | markerBean.setName(result.getName()); |
| | | markerBean.setRemarks(result.getRemarks()); |
| | | 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); |
| | | } |
| | | DaoSingleton.getInstance(MapFragment.this.getContext()).markerDao().deleteAll(); |
| | | // 使用 RxJava 异步插入数据 |
| | | DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll(markerBeans) |
| | | .subscribeOn(Schedulers.io()) // 在 IO 线程上执行 |
| | | .observeOn(AndroidSchedulers.mainThread()) // 在主线程上观察 |
| | | .subscribe(() -> { |
| | | // 插入成功 |
| | | Log.i("mWebView", "数据插入成功"); |
| | | }, throwable -> { |
| | | // 插入失败 |
| | | Log.e("mWebView", "数据插入失败: " + throwable.getMessage()); |
| | | }); |
| | | } |
| | | } |
| | | } else { |
| | | ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg()); |
| | | } |
| | | } |
| | | |
| | | }); |
| | | } |
| | | |
| | | |
| | | void initView() { |
| | | binding.flyBtn.setOnClickListener(v -> { |
| | | mWebView.evaluateJavascript("javascript:locationOverLay(116.399565,39.89432)", value -> { |
| | | }); |
| | | |
| | | 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; |
| | | initLocalData(); |
| | | aginShowLocation(null); |
| | | |
| | | } |
| | | }); |
| | | //巡检按钮 |
| | | binding.inspectButton.setOnClickListener(v -> { |
| | | 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 -> { |
| | | if (mInspectionState == InspectionUtils.STAT_INSPECTION) { |
| | | chageInspecState(InspectionUtils.PAUSE_INSPECTION); |
| | | } else { |
| | | chageInspecState(InspectionUtils.STAT_INSPECTION); |
| | | } |
| | | }); |
| | | //停止巡检 |
| | | binding.inspectClose.setOnClickListener(v -> { |
| | | chageInspecState(InspectionUtils.STOP_INSPECTION); |
| | | }); |
| | | //上报问题 |
| | | binding.putButton.setOnClickListener(v -> { |
| | | Intent issue = new Intent(MapFragment.this.getActivity(), AddIssueActivity.class); |
| | | MapFragment.this.getActivity().startActivity(issue); |
| | | }); |
| | | } |
| | | |
| | | |
| | | public void showWaterIntakeDetail(String data){ |
| | | binding.bottomLL.setVisibility(View.VISIBLE); |
| | | public void showWaterIntakeDetail(String data) { |
| | | MyLog.i(data); |
| | | 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()); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取地图中心点 |
| | | */ |
| | | private void getCenterPoint() { |
| | | |
| | | public void closeWaterIntakeDetail(){ |
| | | 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) { |
| | | if (t.isSuccess()) { |
| | | if (centerPointBean == null) { |
| | | centerPointBean = new CenterPointBean(); |
| | | } |
| | | centerPointBean.setLat(t.getContent().getLat()); |
| | | centerPointBean.setLng(t.getContent().getLng()); |
| | | centerPointBean.setZoomMp(t.getContent().getZoomMp()); |
| | | DaoSingleton.getInstance(MapFragment.this.getContext()).centerPointDao().insert(centerPointBean); |
| | | jumpCenterPoint(); |
| | | } else { |
| | | ToastUtil.showToast(MapFragment.this.getContext(), t.getMsg()); |
| | | } |
| | | } |
| | | |
| | | }); |
| | | } |
| | | |
| | | public void closeWaterIntakeDetail() { |
| | | binding.bottomLL.setVisibility(View.GONE); |
| | | } |
| | | |
| | | /** |
| | | * 上报巡检记录 |
| | | */ |
| | | private void pushLocationData(InspectionLocationBean inspectionLocationBean) { |
| | | inspectionRequest.setInspectId(inspectionLocationBean.getInspectId()); |
| | | inspectionRequest.setInspectorId(mInspectionBean.getInspectorId()); |
| | | if (mInspectionBean != null) { |
| | | inspectionRequest.setStartTime(mInspectionBean.getStartTime()); |
| | | if (!TextUtils.isEmpty(mInspectionBean.getStopTime())) { |
| | | inspectionRequest.setStopTime(mInspectionBean.getStopTime()); |
| | | } |
| | | } |
| | | InspectionRequest.Track track = new InspectionRequest.Track(); |
| | | track.setLat(inspectionLocationBean.getLat()); |
| | | track.setLng(inspectionLocationBean.getLng()); |
| | | track.setLocateTime(inspectionLocationBean.getLocateTime()); |
| | | inspectionRequest.getTracks().clear(); |
| | | inspectionRequest.addTracks(track); |
| | | 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<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); |
| | | InspectionUtils.updateInspectionLocationData(MapFragment.this.getContext(), inspectionLocationBean); |
| | | } else { |
| | | |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | CrashReport.postCatchedException(e); |
| | | } |
| | | |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 定位监听 |
| | | */ |
| | | private Observer<Object> locationObserver = new Observer<Object>() { |
| | | @Override |
| | | public void onChanged(Object o) { |
| | | if (mInspectionBean != null) { |
| | | LatLonBean latLonBean = (LatLonBean) o; |
| | | if (InspectionUtils.isThanMinMeters(lastLatLonBean, latLonBean)) { |
| | | //大于最小距离 |
| | | lastLatLonBean = latLonBean; |
| | | Log.i("chageInspecState", "lat:" + latLonBean.getLatitude() + ",log:" + latLonBean.getLongitude()); |
| | | 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 -> { |
| | | }); |
| | | //上传坐标 |
| | | pushLocationData(inspectionLocationBean); |
| | | } else { |
| | | Log.d(TAG, "isThanMinMeters>>>false"); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | |
| | | /** |
| | | * 修改巡检状态 |
| | | * |
| | | * @param inspectionState |
| | | */ |
| | | private void chageInspecState(int inspectionState) { |
| | | |
| | | //0没有开始,1开始,2暂停,3关闭 |
| | | switch (inspectionState) { |
| | | case InspectionUtils.NO_INSPECTION: |
| | | binding.inspectButton.setVisibility(View.VISIBLE); |
| | | binding.inspectRL.setVisibility(View.GONE); |
| | | binding.inspectButton.setText("巡"); |
| | | LiveEventBus.get(CommonKeyName.locationData).removeObserver(locationObserver); |
| | | //关闭定位 |
| | | ServiceUtils.stopLocationService(MapFragment.this.getContext()); |
| | | break; |
| | | case InspectionUtils.STAT_INSPECTION_ONCLICK: |
| | | //添加新的巡检记录 |
| | | mInspectionBean = InspectionUtils.startInspection(this.getContext()); |
| | | startLocation(); |
| | | break; |
| | | case InspectionUtils.STAT_INSPECTION://1开始 |
| | | |
| | | startLocation(); |
| | | break; |
| | | case InspectionUtils.PAUSE_INSPECTION://暂停 |
| | | try { |
| | | //关闭定位 |
| | | ServiceUtils.stopLocationService(MapFragment.this.getContext()); |
| | | 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(); |
| | | break; |
| | | default: |
| | | } |
| | | mInspectionState = inspectionState; |
| | | } |
| | | |
| | | /** |
| | | * 意外退出后继续显示之前的坐标 |
| | | */ |
| | | public void aginShowLocation(List<InspectionLocationBean> locationBeans) { |
| | | 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(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 跳转地图中心点 |
| | | */ |
| | | 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 |
| | | */ |
| | | private void startLocation() { |
| | | //获取定位服务传过来的坐标点 |
| | | 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)); |
| | | inspectionRequest = new InspectionRequest(); |
| | | SharedPreferencesHelper.getInstance(this.getContext()).put(CommonKeyName.inspectionState, InspectionUtils.STAT_INSPECTION); |
| | | ServiceUtils.startLocationService(MapFragment.this.getContext(), false); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 申请后台定位权限 |
| | | */ |
| | | 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(); |
| | | } |
| | | } |
| | | } |