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流形式)。

更多分享請關注,請關注愛開發

每天不僅學到技術,還能分享到更多的正能量哦!還能跟一萬多開發者互動溝通



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章