MyWebViewClient.java 4.74 KB
package com.polysoft.nafmii.webview;

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;

import com.tencent.smtt.export.external.interfaces.SslError;
import com.tencent.smtt.export.external.interfaces.SslErrorHandler;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;

import java.util.Map;

import ren.yale.android.cachewebviewlib.WebViewCacheInterceptorInst;

public class MyWebViewClient extends WebViewClient {
    private final WebviewLoadListener listener;

    public MyWebViewClient(WebviewLoadListener listener) {
        this.listener = listener;
    }

    /**
     * 在开始加载网页时会回调
     */
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        if (null != this.listener) {
            this.listener.onWebviewLoad(WebviewLoadListener.TYPE_START, null);
        }
    }

    /**
     * 在结束加载网页时会回调
     */
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        if (null != this.listener) {
            this.listener.onWebviewLoad(WebviewLoadListener.TYPE_FINISH, null);
        }
    }


    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("tel:")) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            view.getContext().startActivity(intent);
            return true;
        }
        // 禁止百度跳转APP
        if (null != url && url.startsWith("baidu")) {
            return true;
        }
        return super.shouldOverrideUrlLoading(view, url);
    }

    /**
     * 加载错误的时候会回调,在其中可做错误处理,比如再请求加载一次,或者提示404的错误页面
     */
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        super.onReceivedError(view, errorCode, description, failingUrl);
        if (null != this.listener) {
            this.listener.onWebviewLoad(WebviewLoadListener.TYPE_ERROR, description);
        }
    }

    /**
     * 当接收到https错误时,会回调此函数,在其中可以做错误处理
     */
    @Override
    public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
//        super.onReceivedSslError(webView, sslErrorHandler, sslError);
        sslErrorHandler.proceed();
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView webView, String s) {
//        return super.shouldInterceptRequest(webView, s);
        android.webkit.WebResourceResponse response = WebViewCacheInterceptorInst.getInstance().interceptRequest(s);
        if (null == response) {
            return super.shouldInterceptRequest(webView, s);
        }
        return buildResponse(response);
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest request) {
        android.webkit.WebResourceRequest res = new android.webkit.WebResourceRequest() {
            @Override
            public Uri getUrl() {
                return request.getUrl();
            }

            @Override
            public boolean isForMainFrame() {
                return request.isForMainFrame();
            }

            @Override
            public boolean isRedirect() {
                return request.isRedirect();
            }

            @Override
            public boolean hasGesture() {
                return request.hasGesture();
            }

            @Override
            public String getMethod() {
                return request.getMethod();
            }

            @Override
            public Map<String, String> getRequestHeaders() {
                return request.getRequestHeaders();
            }
        };

        android.webkit.WebResourceResponse response = WebViewCacheInterceptorInst.getInstance().interceptRequest(res);
        if (null == response) {
            return super.shouldInterceptRequest(webView, request);
        }
        return buildResponse(response);
    }

    private WebResourceResponse buildResponse(android.webkit.WebResourceResponse response) {
        WebResourceResponse res = new WebResourceResponse();
        res.setMimeType(response.getMimeType());
        res.setEncoding(response.getEncoding());
        res.setData(response.getData());
        res.setResponseHeaders(response.getResponseHeaders());
        res.setStatusCodeAndReasonPhrase(response.getStatusCode(), response.getReasonPhrase());
        return res;
    }
}