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的主要内容,如果未能解决你的问题,请参考以下文章