MyWebViewClient.java
4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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;
}
}