Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing Data From Javascript To Android WebView

I have written a piece of Java code which is intended as to call Java code from Javascript by a android WebView gateway.

webView = (WebView) findViewById(R.id.captchaView);
WebSettings ws = webView.getSettings();
ws.setJavaScriptEnabled(true);
webView.loadUrl("https://google.com/");

webView.setWebViewClient(BrowserHandler);
webView.addJavascriptInterface(new IJavascriptHandler(), "cpjs");

WebViewClient BrowserHandler = new WebViewClient() {
   @Override
   public void onPageFinished(WebView view, String url) {
      view.loadUrl("javascript:window.cpjs.onPageLoaded(document.body.innerHTML);void(0);");
   }
};

final class IJavascriptHandler {
   IJavascriptHandler() {
   }

   public void onPageLoaded(String html) {
      // this is called from JS
      Toast t = Toast.makeText(getApplicationContext(), "Yes", 2000);
      t.show();
   }
}

The above code checks for web page load and once the page is finished loading, it will call javascript function which is exposed from Java so it could carry what I need from the page.

This is not working as expected what it does is simply refresh the page every few seconds. I am not sure what is wrong here?

like image 394
Umair A. Avatar asked Nov 06 '22 03:11

Umair A.


1 Answers

Well, there are lots of things that are rather strange in what you have done.

  • From Java, you are triggering Javascript...to call back into Java. You are assuming this is safe.

  • You are loading the Google home page, which will perform a redirect when it encounters an Android browser, the last time I checked.

  • You are attempting to display a Toast, yet you have no idea if that code will run on the main application thread or not.

like image 59
CommonsWare Avatar answered Nov 14 '22 21:11

CommonsWare