appView.addJavascriptInterface()在API 17上不起作用

我能够从我的phonegap java脚本function和android 2.2使用javafunction,但相同的代码是不是在API 17上运行。我应该做什么来调用原始java代码从API 17中的Java脚本。

我在我的java文件中使用这个代码

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

我的CustomNativeAccess类是

 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; } 

在我的Java脚本中,我使用这一行来调用这个login函数

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

所以使用这个我成功地在api 2.2上调用这个,但是当我在api 17上运行这个代码时,它给了我错误

Uncaught TypeError:Object [object Object]在file:///android_asset/www/index.html:81没有方法'login'

如何我可以使用这个API 17

Solutions Collecting From Web of "appView.addJavascriptInterface()在API 17上不起作用"

你必须做的API 17是用@JavascriptInterface注释你的方法:

 Public class CustomNativeAccess { @JavascriptInterface 

然后摆脱构造函数部分:

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

另外请确保您在项目中导入了JavascriptInterface:

  import android.webkit.JavascriptInterface; 

你可以在这里阅读更多: http : //developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

编辑:你将不得不在你的类中使用@JavascriptInterface注解每个方法,你想从Javascript访问。

从Android 4.2文档:

警告:如果您已将targetSdkVersion设置为17或更高,则必须将@JavascriptInterface注释添加到您希望可用的网页代码的任何方法( 该方法也必须是公共的 )。 如果您没有提供注释,那么在运行Android 4.2或更高版本时,您的网页将无法访问该方法。

来源:Android WebView Doc(强调添加)

我刚刚用带有API 17的addJavascriptInterface编写了Web应用程序,效果很好。 我不知道你的代码发生了什么事。 也许你可以试试这些:

确保你添加:

 WebSettings webSettings = appView.getSettings(); webSettings.setJavaScriptEnabled(true); 

其次,为什么你使用super.loadUrl,而不是appView加载的HTML?

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

解决scheme:

  1. 降低清单文件中的android:targetSdkVersion为16。
  2. 在project.properties:target target=android-17中将编译api级别更改为17,并使用@JavascriptInterface注释callback方法。