【问题标题】:appView.addJavascriptInterface() does not work on API 17appView.addJavascriptInterface() 不适用于 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 上使用它

【问题讨论】:

    标签: java javascript android cordova


    【解决方案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】:

      解决方案:

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

      【讨论】:

      • 这是过时的答案。 Play 商店不允许设置 targetsdk=17。仅供参考
      猜你喜欢
      • 2017-07-24
      • 1970-01-01
      • 2016-12-15
      • 2020-04-24
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多