Android WebView Intercept iframe Tag Internal Jump Tutorial
- 2021-11-30 01:25:50
- OfStack
Recently, there is an advertisement space in the project that needs to be dynamically configured. In the background, a code of html nested iframe label is given, and Android is required to intercept the jump inside iframe and handle it by itself.
For example, the following is a section of html code, nested with this iframe tag, and src is the jump address. Now I will intercept when you click on this website, and do my own processing instead of jumping.
<html>
<iframe src="https://www.ofstack.com/" frameborder='0' scrolling='no' width='100%' height='300'>
</iframe>
</html>
oh, this is the first time I know the iframe tag, but I thought it should be similar to intercepting h5 normally, so I started to code with great interest, but no matter how to configure WebView or rewrite shouldOverrideUrlLoading, I just can't intercept the website in iframe. . . Later, I studied (bai) and (du) for a long time, and finally intercepted it.
Implementation method:
First of all, your WebView needs setWebViewClient, rewrite
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {} Method, and then setWebChromeClient , rewrite onCreateWindow Method, in which you create a new WevView, Join to webView In, for the new one webView setWebViewClient , and then rewrite shouldVeerrideUrlLoading Method, intercept here.
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 Implement your interception method here
if (url.contains("https://www.ofstack.com")){
toast(" Intercepted " + url);
Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);
intent.putExtra("url",url);
startActivity(intent);
}else {
webView.loadUrl(url);
}
return true;
}
});
return true;
}
});
The complete code is as follows:
private void initWebView(WebView webView) {
// Enable support javascript
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setSupportZoom(false); // Support for Zoom
settings.setBuiltInZoomControls(false); // Support gesture scaling
settings.setDisplayZoomControls(false); // Whether to display the zoom button
settings.setDefaultTextEncodingName("utf-8"); // Set text encoding
settings.setUseWideViewPort(false); // Adjust the picture to fit WebView The size of
settings.setLoadWithOverviewMode(true); // Adaptive screen
settings.setDomStorageEnabled(true);
settings.setSaveFormData(true);
settings.setSupportMultipleWindows(true);
settings.setAppCacheEnabled(true);
settings.setPluginState(WebSettings.PluginState.ON);// Support plug-ins
settings.setCacheMode(WebSettings.LOAD_NO_CACHE); // Cache is not applicable
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);// Support content relayout
webView.setOverScrollMode(View.OVER_SCROLL_NEVER); // Cancel WebView Shadow when scrolling or dragging to the top and bottom in
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); // Cancel the white edge effect of scroll bar
// >= 19(SDK4.4) Start hardware acceleration, otherwise start software acceleration
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
settings.setLoadsImagesAutomatically(true); // Support automatic loading of pictures
} 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(); // Accept certificates from all websites
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (request.getUrl().toString().contains("http://www.baidu.com")){
toast(" Intercepted 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("//www.ofstack.com")){
toast(" Intercepted " + url);
Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);
intent.putExtra("url",url);
startActivity(intent);
}else {
webView.loadUrl(url);
}
return true;
}
});
return true;
}
});
}