appView.addJavascriptInterface()不适用于API 17

我可以使用我的phonegap java脚本函数和android 2.2中的java函数,但是相同的代码不能在API 17上运行。我应该怎么做才能从API 17中的java脚本调用本机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脚本中,我使用此行来调用此登录函数

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

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

未捕获的TypeError:对象[object Object]在file:///android_asset/www/index.html上没有方法’login’:81

我如何在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

编辑:您必须使用您希望从Javascript访问的类中的@JavascriptInterface注释每个方法。

从Android 4.2文档:

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

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

我刚用addJavascriptInterface和API 17编写了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"); 

解决方案:

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