WebView拦截替换URL请求,Codrova踩坑之路
2016-08-23 15:53
435 查看
在做H5 交互的过程中,通过webview加载网络图片的时候一直加载不出来
排查原因发现是android 对外部资源进行了拦截处理
Android中处理网页时我们必然用到WebView,这里我们有这样一个需求,我们想让WebView在处理网络请求的时候将某些请求拦截替换成某些特殊的资源。具体一点儿说,在WebView加载
好在Android中的WebView比较强大,从API 11(Android 3.0)开始, shouldInterceptRequest被引入就是为了解决这一类的问题。
shouldInterceptRequest这个回调可以通知主程序WebView处理的资源(css,js,image等)请求,并允许主程序进行处理后返回数据。如果主程序返回的数据为null,WebView会自行请求网络加载资源,否则使用主程序提供的数据。注意这个回调发生在非UI线程中,所以进行UI系统相关的操作是不可以的。
shouldInterceptRequest有两种重载。
public WebResourceResponse shouldInterceptRequest (WebView view, String url) 从API 11开始引入,API 21弃用
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) 从API 21开始引入
本次例子暂时使用第一种,即shouldInterceptRequest (WebView view, String url)。
其中WebResourceResponse需要设定三个属性,MIME类型,数据编码,数据(InputStream流形式)。
排查原因发现是android 对外部资源进行了拦截处理
Android中处理网页时我们必然用到WebView,这里我们有这样一个需求,我们想让WebView在处理网络请求的时候将某些请求拦截替换成某些特殊的资源。具体一点儿说,在WebView加载
http://m.sogou.com时,会加载一个logo图片,我们的需求就是将这个logo图片换成另一张图片。
shouldInterceptRequest
好在Android中的WebView比较强大,从API 11(Android 3.0)开始, shouldInterceptRequest被引入就是为了解决这一类的问题。shouldInterceptRequest这个回调可以通知主程序WebView处理的资源(css,js,image等)请求,并允许主程序进行处理后返回数据。如果主程序返回的数据为null,WebView会自行请求网络加载资源,否则使用主程序提供的数据。注意这个回调发生在非UI线程中,所以进行UI系统相关的操作是不可以的。
shouldInterceptRequest有两种重载。
public WebResourceResponse shouldInterceptRequest (WebView view, String url) 从API 11开始引入,API 21弃用
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) 从API 21开始引入
本次例子暂时使用第一种,即shouldInterceptRequest (WebView view, String url)。
示例代码
WebView webView = new WebView(this); webView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { Log.i(LOGTAG, "shouldInterceptRequest url=" + url + ";threadInfo" + Thread.currentThread()); WebResourceResponse response = null; if (url.contains("logo")) { try { InputStream localCopy = getAssets().open("droidyue.png"); response = new WebResourceResponse("image/png", "UTF-8", localCopy); } catch (IOException e) { e.printStackTrace(); } } return response; } }); setContentView(webView); webView.loadUrl("http://m.sogou.com"); |
相关文章推荐
- Android中WebView中拦截所有请求并替换URL
- Android中WebView中拦截所有请求并替换URL(支持AJAX的post请求类型)
- Android中WebView拦截替换网络请求数据
- Android中WebView拦截替换网络请求数据
- Android中WebView拦截替换网络请求数据
- Android中WebView拦截替换网络请求数据
- 关于webView拦截H5网络请求数据,替换本地数据问题
- iOS下JS与OC互相调用(二)-->WKWebView 拦截URL
- 重新想象 Windows 8.1 Store Apps (81) - 控件增强: 加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图
- JS调Native:(1)拦截url:WebViewClient.shouldOverrideUrlLoading (2)绑定Java对象:WebView.addJavascriptInterface
- android webview一篇文章全面了解(基本使用,url拦截,js跟java交互)
- Android 拦截WebView加载URL,控制其加载CSS、JS资源
- Android webView拦截url
- Android webView拦截url
- android web view的学习 2 通过WebChomeClient 实现进度条和title,通过WebViewClient 来进行url的拦截,和javascript的交互
- iOS下JS与OC互相调用(二)--WKWebView 拦截URL
- Android WebView拦截请求详解
- webView 拦截网络请求
- 要是 IOS 开发的哥们告诉大家说webview 和 本地交互只能通过 “拦截Url” 的方式。。。
- 拦截webview上的请求,进行一系列操作