Android的WebView拦截数据

有这样的一个需求:

在WebView加载 某网站 时,会加载一个logo图片,我们的需求就是将这个logo图片换成另一张图片。

这时

shouldInterceptRequest

就出场了。

从API 11(Android 3.0)开始, shouldInterceptRequest被引入就是为了解决这一类的问题。

shouldInterceptRequest这个回调可以通知主程序WebView处理的资源(比如css,js,image等)请求,并允许主程序进行处理后返回数据。如果主程序返回的数据为null,WebView会自行请求网络加载资源,否则使用主程序提供的数据。注意这个回调发生在非UI线程中,所以进行UI系统相关的操作是不可以的。

下面我们来看shouldInterceptRequest

shouldInterceptRequest有两种重载:
//从API 11开始引入,API 21弃用

  1. public WebResourceResponse shouldInterceptRequest (WebView view, String url)

//从API 21开始引入

  1. public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)

关键代码:

WebView webView = new WebView(this);
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,  String url) {

WebResourceResponse response = null;
if (url.contains("logo")) {
   try {
       InputStream localCopy = getAssets().open("aikaifa.png");
       response = new WebResourceResponse("image/png", "UTF-8", localCopy);
   } catch (IOException e) {
       e.printStackTrace();
   }        
}
return response;
}    
});
setContentView(webView);
webView.loadUrl("请求的url");

关键的地方

WebResourceResponse需要设定三个属性,MIME类型,数据编码,数据(InputStream流形式)。

更多分享请关注,请关注爱开发

每天不仅学到技术,还能分享到更多的正能量哦!还能跟一万多开发者互动沟通

Android的WebView拦截数据_第1张图片


你可能感兴趣的:(Android的WebView拦截数据)