Android WebView攔截iframe標籤內部跳轉

最近項目裏有個廣告位需要動態配置,後臺給了一段 html 嵌套iframe標籤的代碼,需要Android攔截iframe內部的跳轉,自己做處理。

比如,下面是一段html代碼,嵌套這iframe標籤,src就是跳轉地址,我現在就要當你點擊該網址的時候做攔截,自己做處理而不是跳轉。

<html> 
<iframe src="https://www.imooc.com/" frameborder='0' scrolling='no' width='100%' height='300'>
</iframe>
</html>

oh,我還是第一次知道iframe標籤,不過想着應該和普通攔截h5差不多,興致勃勃的就開始擼代碼了,但是無論怎麼配置WebView,還是重寫 shouldOverrideUrlLoading ,就是攔截不了iframe裏的網址。。。後來研(bai)究(du)了很久,終於攔截到了。

實現方法:

  首先,你的WebView要 setWebViewClient ,重寫

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {} 方法,然後setWebChromeClient,重寫onCreateWindow方法,在裏面創建新的WevView,加入到webView裏,給新的webView  setWebViewClient,再重寫shouldVeerrideUrlLoading方法,在這裏攔截。
        webView.setWebChromeClient(new WebChromeClient(){
            
            @Override
            public boolean onCreateWindow(WebView webView, boolean isDialog, boolean isUserGesture, Message resultMsg) {
                WebView newWebView = new WebView(getActivity());
                webView.addView(newWebView);

                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
                transport.setWebView(newWebView);
                resultMsg.sendToTarget();

                newWebView.setWebViewClient(new WebViewClient(){

                    @Override
                    public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                        //TODO 在這裏實現你的攔截方法
                        if (url.contains("https://www.imooc.com")){
                            toast("攔截到了" + url);
                            Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);
                            intent.putExtra("url",url);
                            startActivity(intent);

                        }else {
                            webView.loadUrl(url);
                        }
                        return true;
                    }
                });

                return true;
            }
        });

 

完整的代碼如下:

private void initWebView(WebView webView) {
        //啓用支持javascript
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setSupportZoom(false); //支持縮放
        settings.setBuiltInZoomControls(false); //支持手勢縮放
        settings.setDisplayZoomControls(false); //是否顯示縮放按鈕
        settings.setDefaultTextEncodingName("utf-8"); //設置文本編碼
        settings.setUseWideViewPort(false); //將圖片調整到適合WebView的大小
        settings.setLoadWithOverviewMode(true); //自適應屏幕
        settings.setDomStorageEnabled(true);
        settings.setSaveFormData(true);
        settings.setSupportMultipleWindows(true);
        settings.setAppCacheEnabled(true);
        settings.setPluginState(WebSettings.PluginState.ON);//支持插件
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //不適用緩存
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//支持內容重新佈局
        webView.setOverScrollMode(View.OVER_SCROLL_NEVER); // 取消WebView中滾動或拖動到頂部、底部時的陰影
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); // 取消滾動條白邊效果
        // >= 19(SDK4.4)啓動硬件加速,否則啓動軟件加速
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            settings.setLoadsImagesAutomatically(true); //支持自動加載圖片
        } else {
            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            settings.setLoadsImagesAutomatically(false);
        }

        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
                Log.w("webView==onLoadResource===url=" + url);
            }

            @Override
            public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
                sslErrorHandler.proceed();  // 接受所有網站的證書
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
              
                if (request.getUrl().toString().contains("http://www.baidu.com")){
                    toast("攔截到了baidu");
                    
                }else {
                    webView.loadUrl(request.getUrl().toString());
                }

                return true;
            }
        });

        webView.setWebChromeClient(new WebChromeClient(){
         
            @Override
            public boolean onCreateWindow(WebView webView, boolean isDialog, boolean isUserGesture, Message resultMsg) {
                WebView newWebView = new WebView(getActivity());
                webView.addView(newWebView);

                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
                transport.setWebView(newWebView);
                resultMsg.sendToTarget();

                newWebView.setWebViewClient(new WebViewClient(){

                    @Override
                    public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                        
                        if (url.contains("http://www.imooc.com")){
                            toast("攔截到了" + url);
                            Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);
                            intent.putExtra("url",url);
                            startActivity(intent);

                        }else {
                            webView.loadUrl(url);
                        }
                        return true;
                    }
                });

                return true;
            }
        });
    }

 

參考文章:https://blog.csdn.net/qq498654921com/article/details/44815281

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