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

2022-09-02 03:07:51

我能够从我的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上运行这个代码时,它给了我错误

未捕获的类型错误:对象 [对象对象] 在 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

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


答案 2

来自 Android 4.2 文档:

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

资料来源:Android WebView Doc(着重号是后加的)