管灌系统巡查员智能手机App
zuoxiao
2024-09-09 f163344ffeb1e699fa1a2dfb8a70055bb1b9be7e
app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -8,22 +8,28 @@
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
@@ -52,17 +58,58 @@
    @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);
            }
        });
    }
@@ -76,7 +123,9 @@
    @Override
    public void onPause() {
        super.onPause();
        //
        mWebView.onPause(); // 通过 onPause 动作通知内核暂停所有的动作,如 DOM 的解析、plugin 的执行、JavaScript 执行等
    }
    @Override
@@ -86,61 +135,67 @@
        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);
    }
}