Passing data from java class to Web View html

Viewed 67809
6 Answers

Just enable DOM Storage and write var x= to string:

webview.getSettings().setJavaScriptEnabled(true);
web.getSettings().setDomStorageEnabled(true);

webview.loadUrl(urlString);
webview.setWebViewClient(new WebViewClient(){

public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);

    String js = "javascript:var x =document.getElementById('username').value = '"+user+"';var y=document.getElementById('password').value='"+pass+"';";

    if (Build.VERSION.SDK_INT >= 19) {
        view.evaluateJavascript(js, new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String s) {
            }
        });
    }
    else {
        view.loadUrl(js);
    }
}

Be careful to call javascript function like this, the str may include single quote or other special characters.

String str = "xxx";
myWebView.loadUrl("javascript:xxx('"+str+"')");

I suggest to encode the str in base64, and decode it on javascript side.

  • Android

    String str = "xxx";
    //encode in base64
    String base64Str = Base64.encodeToString(str.getBytes(), Base64.NO_WRAP);
    myWebView.loadUrl("javascript:xxx('"+ base64Str +"')");
    
  • Javascript

    function xxx(val) {
        //decode from base64
        var str = atob(data)
    }
    

Pass the paramter directly in the url

webView.loadUrl("file:///android_asset/animation.html?message=testing");

Get the paramter in html file

var url_string = window.location.href
var url = new URL(url_string);
var message= url.searchParams.get("message");

Solutions by Hungr would work, but using the same document they point out, I do the following:

in my Android code WebAppInterface class:

@JavascriptInterface
fun provideData(val input: String): String{
val output = ""
//some operation with input
    return output
}

then in host activity for webview:

webView.addJavascriptInterface(WebAppInterface(this), "Provider")

Inside your JS or HTML:

document.getElementbyId("Text").innerhtml = Provider.provideData(input);
Related