vivek tiwari vivek tiwari - 5 months ago 27
Android Question

appView.addJavascriptInterface() does not work on API 17

i am able to use java function from my phonegap java script function and android 2.2
but same code is not run on API 17. what should i have to do to call native java code on from java script in API 17.

i use this code in my java file

objCustomNativeAccess = new CustomNativeAccess(this, appView);
appView.addJavascriptInterface(objCustomNativeAccess,
"CustomNativeAccess");
super.loadUrl("file:///android_asset/www/index.html");


my CustomNativeAccess class is

public class CustomNativeAccess {
private WebView mAppView;
private DroidGap mGap;

/**
* Constructor
*
* @param gap
* @param view
*/
public CustomNativeAccess(DroidGap gap, WebView view) {
mAppView = view;
mGap = gap;
}

/**
* Get the device phone number
*
* @return
*/
public JSONObject login(String email, String password) {
JSONObject object = new JSONObject();
object.put("Login_Status", login_status);
object.put("date", dateString);
return object;
}


and in my java script i use this line to call this login function

var value = window.CustomNativeAccess.login(email,pass);


so using this i successfully call this on api 2.2 but when i run this code on api 17 it give me error

Uncaught TypeError: Object [object Object] has no method 'login' at file:///android_asset/www/index.html:81

how i can i use this on api 17

Answer

What you have to do on API 17 is annotate your method with @JavascriptInterface:

Public class CustomNativeAccess {
   @JavascriptInterface

and then get rid of the constructor part:

/*private WebView mAppView;
    private DroidGap mGap;
    public CustomNativeAccess(DroidGap gap, WebView view) {
        mAppView = view;
        mGap = gap;
    }
*/

Also be sure you import JavascriptInterface in your project:

 import android.webkit.JavascriptInterface;

You can read about it more here: http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

Edit: You will have to annotate each method with @JavascriptInterface within your class that you'd like to access from Javascript.

Comments