Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the web page contents from a WebView?

On Android, I have a WebView that is displaying a page.

How do I get the page source without requesting the page again?

It seems WebView should have some kind of getPageSource() method that returns a string, but alas it does not.

If I enable JavaScript, what is the appropriate JavaScript to put in this call to get the contents?

webview.loadUrl("javascript:(function() { " +       "document.getElementsByTagName('body')[0].style.color = 'red'; " +       "})()");   
like image 756
gregm Avatar asked Mar 04 '10 02:03

gregm


People also ask

How do I display HTML content in WebView?

Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml. In the above code, we have taken web view to show html content.

Which method is used to load HTML content in WebView?

The loadUrl() and loadData() methods of Android WebView class are used to load and display web page.

What is WebView content?

Android WebView is a system component for the Android operating system (OS) that allows Android apps to display content from the web directly inside an application.


2 Answers

I know this is a late answer, but I found this question because I had the same problem. I think I found the answer in this post on lexandera.com. The code below is basically a cut-and-paste from the site. It seems to do the trick.

final Context myApp = this;  /* An instance of this class will be registered as a JavaScript interface */ class MyJavaScriptInterface {     @JavascriptInterface     @SuppressWarnings("unused")     public void processHTML(String html)     {         // process the html as needed by the app     } }  final WebView browser = (WebView)findViewById(R.id.browser); /* JavaScript must be enabled if you want it to work, obviously */ browser.getSettings().setJavaScriptEnabled(true);  /* Register a new JavaScript interface called HTMLOUT */ browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");  /* WebViewClient must be set BEFORE calling loadUrl! */ browser.setWebViewClient(new WebViewClient() {     @Override     public void onPageFinished(WebView view, String url)     {         /* This call inject JavaScript into the page which just finished loading. */         browser.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");     } });  /* load a web page */ browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html"); 
like image 151
jluckyiv Avatar answered Sep 20 '22 00:09

jluckyiv


Per issue 12987, Blundell's answer crashes (at least on my 2.3 VM). Instead, I intercept a call to console.log with a special prefix:

// intercept calls to console.log web.setWebChromeClient(new WebChromeClient() {     public boolean onConsoleMessage(ConsoleMessage cmsg)     {         // check secret prefix         if (cmsg.message().startsWith("MAGIC"))         {             String msg = cmsg.message().substring(5); // strip off prefix              /* process HTML */              return true;         }          return false;     } });  // inject the JavaScript on page load web.setWebViewClient(new WebViewClient() {     public void onPageFinished(WebView view, String address)     {         // have the page spill its guts, with a secret prefix         view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");     } });  web.loadUrl("http://www.google.com"); 
like image 27
durka42 Avatar answered Sep 20 '22 00:09

durka42