在Android自带的WebView中,如果需要对访问的URL或者资源进行拦截,主要涉及到WebViewClient中的三个方法:onPageStarted、shouldOverrideUrlLoading、shouldInterceptRequest。首先来分析onPageStarted方法和shouldOverrideUrlLoading方法,分别在两个方法以及onPageFinished方法中打印log
-
当用户使用WebView的loadUrl方法开启一个网页时,其中onPageStarted方法会执行,而shouldOverrideUrlLoading则不会执行
-
当用户继续点击网页内的链接时,onPageStarted和shouldOverrideUrlLoading均会执行,并且shouldOverrideUrlLoading要先于onPageStarted方法执行
-
当用户点击网页中的链接后,点击back,返回历史网页时,onPageStarted会执行,而shouldOverrideUrlLoading不会执行
综上所述,当需要对访问的网页进行策略控制时,需要在onPageStarted方法中进行拦截,如下示例代码:
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d(TAG, "onPageStarted url is " + url);
boolean res = checkUrl(url);
if (!res) {
view.stopLoading();
view.loadUrl(LOCAL_SAFE_URL);
然后,来分析一下shouldInterceptRequest(WebView view, String url),此方法从Android API 11(3.0)开始提供,位于WebViewClient 内,当用户使用WebView的loadUrl方法打开网页、点击网页中的链接、返回历史网页时,所有资源的加载均会调用shouldInterceptRequest方法
进行资源替换时,可以将网页资源,例如html、css、js、图片等存放在本地,在shouldInterceptRequest对WebView加载的资源进行拦截,当符合某种策略时,替换为本地的资源,资源的MIME类型可以采用以下方法获取: MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url))
示例:
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Log.d(TAG, "shouldInterceptRequest : " + url);
Uri uri = Uri.parse(url);
String localPath = "file://" + Environment.getExternalStorageDirectory().getAbsoluteFile() + "/www" + uri.getPath();
File file = new File(localPath);
try {
URL localUri = new URL(localPath);
if (localUri != null) {
InputStream is = localUri.openConnection().getInputStream();
WebResourceResponse resourceResponse = new WebResourceResponse(
MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url))
, "UTF-8", is);
Log.d(TAG, "replace " + MimeTypeMap.getFileExtensionFromUrl(url));
return resourceResponse;
} catch (IOException e) {
e.printStackTrace();
return super.shouldInterceptRequest(view, url);
接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个sign=xxxx 的标志位,同时添加手机本地的数据比如 sessionToken=sd54f5sd4ffsdf45454564 、deviceId=863970025919887
文章链接:http://blog.csdn.net/kpioneer123/article/details/51438204
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
//拦截
Log.d("拦截Url:{}...
1 WebView基本用法WebView的基本用法相信大多数android开发者都是会使用的,最简单的就是调用个loadUrl方法,但是记得要在清单文件中添加网络权限。我也简单了写了一个加载百度的,如下图
代码如是: mWebview = (WebView) findViewById(R.id.my_webview);
mWebview.setWebViewClient(new WebVie
需求背景是有些H5上的请求需要拦截掉,直接返回失败/空。留给笔记…
// mWebview.setWebChromeClient(new NChromeClient());
private final class NWebViewClient extends WebViewClient {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest req
接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个xxx=1的标志位。
例如 http://www.baidu.com 加上标志位就变成了 http://www.baidu.com?xxx=1
寻找解决方案
从 Android API 11 (3.0) 开始,WebView 开始在 WebViewClient 内提供了这样一条 API ,如下:
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
就是说只要实现 WebViewClient 的
接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个sign=xxxx 的标志位,同时添加手机本地的数据比如 sessionToken=sd54f5sd4ffsdf45454564
、deviceId=863970025919887
例如 http://www.baidu.com 加上标志位就变成了 http://www.baidu.c
上一节说到可以使用超链接标签来定义相应的协议,当用户点击了此标签之后,客户端能拦截到此事件,然后进行拦截并作出相应的处理:
方法是自定义一个WebViewClient,然后给webView设置WebViewClient,这样在点击超链接的时候就能拿到相应的回调。
上一节说到可以使用超链接标签来定义相应的协议,当用户点击了此标签之后,客户端能拦截到此事件,然后进行拦截并作出相