我正在尝试解析每个click事件,拦截试图加载到Webview中的http url,并根据该url解析的逻辑集决定是否显示它。我遵循了以下3个StackOverflow链接的建议:
1)Intercept and override HTTP requests from WebView
2)Android Web-View shouldOverrideUrlLoading() Deprecated.(Alternative)
3)https://stackoverflow.com/a/32711309/2480714
没有解决我的问题。主要问题是用户单击Web视图以加载超链接,并且似乎每次未调用 shouldOverrideUrlLoading 方法或未正确拦截url。
我创建了Custom WebViewClient并首先覆盖了它,目的是在未经我批准的情况下停止所有加载,但是遇到了麻烦。 一些网址正在加载并绕过我的覆盖方法,有些则没有。我不知道为什么会这样。
这是我的WebviewClient类:
public class CustomWebViewClient2 extends WebViewClient {
public CustomWebViewClient2(){
}
@Override
public void onPageFinished(WebView view, String url) {
Log.d("log", "(CustomWebViewClient) onPageFinished, URL == " + url);
}
@SuppressLint("NewApi")
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
Log.d("log", "shouldInterceptRequest hit");
return null;
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Log.d("log", "shouldInterceptRequest hit");
return null;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Log.d("log", "(CustomWebViewClient) shouldOverrideUrlLoading");
return true;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("log", "(CustomWebViewClient) shouldOverrideUrlLoading");
return true;
}
@Override
public void onLoadResource(WebView view, String url) {
Log.d("log", "intercepting onLoadResource, url == " + url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("log", "onPageStarted url == " + url);
}
}
如您所见,它覆盖了正确的方法,并且(理论上)应该从不加载URL,除非我将其传递给Webview进行加载,但不幸的是某些网站正在加载,而另一些网站正在加载不是。
我还尝试根据以下答案之一中的注释禁用缓存:
“小心!如果您拦截浏览器的尝试 检索图像(或可能的任何资源),然后返回null (意味着让WebView继续检索图像),将来 对此资源的请求可能只是进入缓存,而不会 触发shouldInterceptRequest()。如果您想截取每个图像 请求,您需要禁用缓存或(我所做的)调用 WebView.clearCache(true)“
但无济于事。为什么有些URL会加载并绕过替代,而另一些却没有?
更新1 :这是一个示例URL https://cookpad.com/us,反映了我所指的问题。它似乎与在服务器端实现的Turbolinks有关。