How to pass JSON-formatted data from a WebView to a HTML page

11,440

I copy pasted your code and it works (nothing is shown because you dont show the data) but the callback made from the Javascript into Android is executed correctly. You can check it with this code:

    WebView mWebView = (WebView) findViewById(R.id.webView1);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.addJavascriptInterface(this, "webConnector");
    mWebView.addJavascriptInterface(this, "toaster");
    mWebView.loadUrl("file:///android_asset/table.html");
    }

    public String load() {
        Log.e("HelloJavascript","HelloJavascript");
        return "{\"key\":\"data\"}";
    }

    public void print(String message){
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

And the HTML

    <html>
    <head>
    <title>Test</title>
    <script type="text/javascript">

    function loader() {
        var jsonData = window.webConnector.load();
        toaster.print(jsonData);
    }

    </script>
    </head>
    <body onload="loader()">
    Do nothing
    </body>
    </html> 
Share:
11,440
DBoy
Author by

DBoy

Updated on July 20, 2022

Comments

  • DBoy
    DBoy almost 2 years

    I am trying to pass JSON-formatted data from my Android WebView to a HTML page. However, the app crashes whenever I try to parse the original JSON data, which I am expecting to be of the format {"key":"data"}

    The aim of my app will be to interpret this JSON data, form it into an array of values, and send it to a HTML page. Is this the correct approach to take?

    Here is my WebView code...

    public class MyWebView extends Activity {
        WebView mWebView;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.web_view);
    
            mWebView = (WebView) findViewById(R.id.webviewSch);
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.addJavascriptInterface(this, "webConnector");
            mWebView.loadUrl("file:///android_asset/table.html");
        }
    
        public String load() {
            return "{\"key\":\"data\"}";
        }
    }
    

    And here is the HTML code...

    <html>
    <head>
    <title>Test</title>
    <script type="text/javascript">
    
    function loader() {
        var jsonData = window.webConnector.load();
    }
    
    </script>
    </head>
    <body onload="loader()">
    Do nothing
    </body>
    </html> 
    

    Here is the log cat:

    04-15 00:35:44.551: W/dalvikvm(442): JNI WARNING: jarray 0x4053f1a0 points to non-array object (Ljava/lang/String;)
    04-15 00:35:44.551: I/dalvikvm(442): "WebViewCoreThread" prio=5 tid=9 NATIVE
    04-15 00:35:44.551: I/dalvikvm(442):   | group="main" sCount=0 dsCount=0 obj=0x4051bcc0 self=0x19b200
    04-15 00:35:44.551: I/dalvikvm(442):   | sysTid=451 nice=0 sched=0/0 cgrp=default handle=1684280
    04-15 00:35:44.551: I/dalvikvm(442):   | schedstat=( 206004592 365607782 69 )
    04-15 00:35:44.551: I/dalvikvm(442):   at android.webkit.LoadListener.nativeFinished(Native Method)
    04-15 00:35:44.551: I/dalvikvm(442):   at android.webkit.LoadListener.nativeFinished(Native Method)
    04-15 00:35:44.551: I/dalvikvm(442):   at android.webkit.LoadListener.tearDown(LoadListener.java:1200)
    04-15 00:35:44.551: I/dalvikvm(442):   at android.webkit.LoadListener.handleEndData(LoadListener.java:721)
    04-15 00:35:44.551: I/dalvikvm(442):   at android.webkit.LoadListener.handleMessage(LoadListener.java:219)
    04-15 00:35:44.551: I/dalvikvm(442):   at android.os.Handler.dispatchMessage(Handler.java:99)
    04-15 00:35:44.551: I/dalvikvm(442):   at android.os.Looper.loop(Looper.java:130)
    04-15 00:35:44.551: I/dalvikvm(442):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:629)
    04-15 00:35:44.551: I/dalvikvm(442):   at java.lang.Thread.run(Thread.java:1019)
    04-15 00:35:44.551: E/dalvikvm(442): VM aborting
    
  • DBoy
    DBoy about 12 years
    Thank you for the reply Addev. I tried your code, but it still crushes. However, after I changed the emulator to 4.0.3 it worked!
  • Maarten
    Maarten over 11 years
    Don't know what you were working with before, but I think the JavaScript interface has a bug in 2.3
  • N Fard
    N Fard over 8 years
    "Uncaught TypeError: window.webConnector.load is not a function", source: myaddress" Do you know why ?
  • Parth Patel
    Parth Patel over 3 years
    @NaeimFard have you got the workaround for the error?
  • N Fard
    N Fard over 3 years
    @ParthPatel really an old one. Don’t remember