appView.addJavascriptInterface() 不适用于 API 17
Posted
技术标签:
【中文标题】appView.addJavascriptInterface() 不适用于 API 17【英文标题】:appView.addJavascriptInterface() does not work on API 17 【发布时间】:2013-04-27 12:48:21 【问题描述】:我可以从我的 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 上运行这个代码时它给了我错误
Uncaught TypeError: Object [object Object] has no method 'login' at file:///android_asset/www/index.html:81
我如何在 api 17 上使用它
【问题讨论】:
【参考方案1】:您在 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;
您可以在此处了解更多信息: WebView Android
编辑:您必须在类中使用@JavascriptInterface 注释您希望从 Javascript 访问的每个方法。
【讨论】:
可以使用没有问题的构造函数。 构造函数没有问题,但此时没有必要 可以确认构造函数没有问题。条件是方法必须有注释@JavascriptInterface并且是public。 在我的情况下应该添加@SuppressLint( "AddJavascriptInterface")
和@JavascriptInterface
。
据说这是为了安全:“托管在 WebView 中的任何不受信任的内容都可能使用反射来找出 JavascriptInterface 对象中的公共方法,然后可以使用它们。” (android-developers.googleblog.com/2013/02/…)。这只是拥有它的对象吗?不能更远吗?如果我有一个匿名类,并且它只有一个函数(并且有这个注解),这是否危险?【参考方案2】:
来自 Android 4.2 文档:
注意:如果您将 targetSdkVersion 设置为 17 或更高,则必须 将 @JavascriptInterface 注释添加到您想要的任何方法 提供您的网页代码(该方法也必须是公开的)。如果你 不提供注释,则该方法将无法访问 在 Android 4.2 或更高版本上运行时的网页。
来源:Android WebView Doc(重点添加)
【讨论】:
【参考方案3】:我刚刚使用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");
【讨论】:
appView.setJavaScriptEnabled
不存在,你用的是哪个PhoneGap version
??我正在使用版本2.9
对不起,有一个错误。应该是webSettings.setJavaScriptEnabled(true).
我从不使用PhoneGap。【参考方案4】:
解决方案:
-
将清单文件中的
android:targetSdkVersion
降低到 16。
在project.properties:target=android-17
中修改编译api级别为17,回调方法注解@JavascriptInterface
。
【讨论】:
这是过时的答案。 Play 商店不允许设置 targetsdk=17。仅供参考以上是关于appView.addJavascriptInterface() 不适用于 API 17的主要内容,如果未能解决你的问题,请参考以下文章