| | |
| | | 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 com.dayu.pipirrapp.databinding.FragmentMapBinding; |
| | | import com.dayu.pipirrapp.js.MyWebViewInterface; |
| | | import com.dayu.pipirrapp.observer.MapFragmenObserver; |
| | | import com.dayu.pipirrapp.service.MyLocationService; |
| | | import com.dayu.pipirrapp.utils.ToastUtil; |
| | | import com.dayu.pipirrapp.utils.MapJpgUtils; |
| | | import com.dayu.pipirrapp.utils.MyLog; |
| | | import com.dayu.pipirrapp.utils.WebViewUtils; |
| | | |
| | | import java.util.List; |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.FileNotFoundException; |
| | | import java.util.Random; |
| | | |
| | | /** |
| | | * author: zuo |
| | |
| | | @Nullable |
| | | @Override |
| | | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { |
| | | |
| | | binding = FragmentMapBinding.inflate(inflater, container, false); |
| | | Log.i("MapFragment", "onCreateView"); |
| | | mWebView = binding.webView; |
| | | initWebView(); |
| | | mWebView.loadUrl("http://192.168.3.178:3002/"); |
| | | mWebView = WebViewUtils.initWebView(mWebView); |
| | | MyWebViewInterface myWebViewInterface = new MyWebViewInterface(MapFragment.this); |
| | | mWebView.addJavascriptInterface(myWebViewInterface, "Android"); |
| | | mWebView.loadUrl("file:///android_asset/index.html"); |
| | | |
| | | initView(); |
| | | //开启定位 |
| | | Intent location = new Intent(this.getActivity(), MyLocationService.class); |
| | | location.putExtra("isSingle", false); |
| | | this.getActivity().startService(location); |
| | | return binding.getRoot(); |
| | | } |
| | | |
| | | /** |
| | | * 添加标注点 |
| | | */ |
| | | 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("\"", "\\\""); |
| | | // String jsonData = "[[116.417854,39.921988,\"235取水口\"],[116.406605,39.921585,\"237取水口\"],[116.412222,39.912345,\"236取水口\"]]"; |
| | | Log.i("mWebView", "addMarker????????????" + jsonData); |
| | | mWebView.evaluateJavascript("javascript:addMarker(\"" + jsonData + "\")", new ValueCallback<String>() { |
| | | @Override |
| | | public void onReceiveValue(String value) { |
| | | Log.i("mWebView", "addMarker!!!!!!!!!" + value); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | |
| | | @Override |
| | | public void onPause() { |
| | | super.onPause(); |
| | | // |
| | | mWebView.onPause(); // 通过 onPause 动作通知内核暂停所有的动作,如 DOM 的解析、plugin 的执行、JavaScript 执行等 |
| | | |
| | | } |
| | | |
| | | @Override |
| | |
| | | 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); // 隐藏原生的缩放控件 |
| | | //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); |
| | | } |
| | | }); |
| | | |
| | | } |
| | | |
| | | void initView() { |
| | | //跳转到指定位置 |
| | | binding.flyBtn.setOnClickListener(v -> { |
| | | mWebView.evaluateJavascript("javascript:moveTo(116.399565,39.89432)", value -> { |
| | | |
| | | 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(); |
| | | // 检查本地缓存 |
| | | File cachedTile = MapJpgUtils.getInsatance(MapFragment.this.getContext()).getCachedTile(url); |
| | | if (cachedTile != null && cachedTile.exists()) { |
| | | // 判断缓存是否过期 |
| | | if (!MapJpgUtils.getInsatance(MapFragment.this.getContext()).isCacheExpired(cachedTile)) { |
| | | try { |
| | | // 从缓存加载瓦片 |
| | | return new WebResourceResponse("image/jpg", "utf-8", new FileInputStream(cachedTile)); |
| | | } catch (FileNotFoundException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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状态码处理错误 |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | public void showWaterIntakeDetail(String data) { |
| | | MyLog.i(data); |
| | | binding.bottomLL.setVisibility(View.VISIBLE); |
| | | } |
| | | |
| | | |
| | | public void closeWaterIntakeDetail() { |
| | | binding.bottomLL.setVisibility(View.GONE); |
| | | } |
| | | |
| | | } |