Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Native code calling JS in Android webapps

I am writing an Android "web" app (I will not upload the APP to the web, but set the HTML+JS inside the application resources). That means, the GUI will be HTML5, and I will use another "native" thread to read from the microphone and hopefully send the "parsed text" to the HTML5/JS code.

Is this possible? In the Android code, I see how can I call native code from JS (and I want the opposite).

http://developer.android.com/guide/webapps/webview.html

like image 724
elcuco Avatar asked Jan 17 '23 12:01

elcuco


1 Answers

Yes, Android rocks at this actually.

I'm posting example code from a random example app that I made but this should get you going.

Lets start by supposing you have to global variable to your webview controlling class:

String name = "John";
String lastName = "Doe";

In the Android class controlling the webview (during onCreate() or when you setup your webview):

webView.addJavascriptInterface(new JavaScriptInterface(), "android")

Inner class to your webview controlling class:

/**
* Sets up the interface for getting access to Latitude and Longitude data
* from device
**/
private class JavaScriptInterface {
    public String getName() {
        return name;
    }
    public String getLastName() {
        return lastName;
    }
    public void onJavascriptButtonPushed(String text) {
        Toast.makeText(WebViewControllingClass.this, "The text of the pressed button is: "+text,Toast.LENGTH_SHORT).show();
    }
}

Thats it for the Android side, now to use it through Javascript:

To get the name and lastname through JavaScript:

if (window.android){
    name = window.android.getName();
    lastName = window.android.getLastName();
}

If you want to raise the toast, set a javascript whose function would be:

if (window.android){
    window.android.onJavascriptButtonPushed("Hello");
}

Edit:

I havent tried this, but a search yielded this, try it out, it should work.

If you want to use it in the other direction:

JS:

function testEcho(message){
     window.JSInterface.doEchoTest(message);
}

Android:

myWebView.loadUrl("javascript:testEcho('Hello World!')");
like image 173
blindstuff Avatar answered Jan 27 '23 19:01

blindstuff