运行 JavaScript 方法并返回参数。

3
我希望在我的安卓应用中运行JavaScript函数,以下是我创建webview的方式:
m_FullJSWebView = new WebView(m_VideoView.getContext());
m_FullJSWebView.loadData(htmltmp, "text/html", "UTF-8");
m_FullJSWebView.getSettings().setJavaScriptEnabled(true);
m_FullJSWebView.addJavascriptInterface(new JavaScriptInterface(m_VideoView.getContext()), "MyAndroid");
m_FullJSWebView.loadUrl("javascript:getValue()");

这是HTML代码:

这是一个段落。

<html>
  <head>
    <script type="text/javascript">
    function getValue(){
       //return value to Android 
       var val= 50;
       MyAndroid.receiveValueFromJs(val);
    }
    </script>
    <title></title>
  </head>
  <body >
    <form name="ipForm" id="ipForm">
      UserName : <input type="text" name="userName">
      <button type="button" onclick="getValue();">Submit</button>
    </form>
  </body>
</html>

这是 JavascriptInterface


public class JavaScriptInterface {
        Context mContext;
        JavaScriptInterface(Context c) {
            mContext = c;
        }
        //add other interface methods to be called from JavaScript

        public void receiveValueFromJs(String str) {
            //do something useful with str
              Toast.makeText(mContext, "Received Value from JS: " + str,Toast.LENGTH_SHORT).show();
        }
}

我在设备上运行后,receiveValueFromJs函数没有被调用。有任何想法是什么问题?


你是否检查过针对API级别为JELLY_BEAN_MR1及以上的应用程序,只有使用JavascriptInterface注释的公共方法才能从JavaScript中访问。 - njzk2
可能现在不相关,但您将不得不对下一个版本进行注释以说明您的方法。 - njzk2
1个回答

1

从文档中可以看到:

请注意,注入的对象在页面下次(重新)加载之前不会出现在JavaScript中。

这意味着您必须按照以下方式更改方法的顺序:

m_FullJSWebView = new WebView(m_VideoView.getContext());
m_FullJSWebView.addJavascriptInterface(new JavaScriptInterface(m_VideoView.getContext()), "MyAndroid");
m_FullJSWebView.loadData(htmltmp, "text/html", "UTF-8");
m_FullJSWebView.getSettings().setJavaScriptEnabled(true);
m_FullJSWebView.loadUrl("javascript:getValue()");

编辑(第二个问题)

addJavascriptInterface 中的 name 参数是 JavaScript 中 Java 对象的名称。它是从 JavaScript 调用方法的对象。

因此,您的调用应该是:

m_FullJSWebView.loadUrl("javascript:MyAndroid.getValue()");

我已经更改了代码,但 receiveValueFromJs 仍未被调用。 - YosiFZ
它仍然不会调用receiveValueFromJs函数,有没有其他方法来运行JS并从中返回值? - YosiFZ
很可能是因为 JavaScript 在 WebView 的私有后台线程上与 Java 对象交互,这意味着你无法从那里显示 Toast。 - njzk2
receiveValueFromJs根本不会被调用,我在那里设置了断点。 - YosiFZ
你用的是什么设备(哪个版本)? - njzk2
银河3,安卓版本4.1.2 - YosiFZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接