API接口上未添加JavaScriptInterface

时间:2014-05-22 07:14:55

标签: javascript android android-webview

我正在使用WebView在我的应用程序中执行一些JS代码。到目前为止,这在我的KitKat(targetSdk)设备和2.2(minSdk)仿真器上都能正常工作。
在4.3 Nexus 7上我遇到了一个错误。似乎JS对象没有被注入。

Uncaught ReferenceError: android is not defined at null:1

在我的代码的精简版本之后:

public void getData(Context ctx) {
    WebView webView = new WebView(ctx);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new AndroidInterface(), "android");
    webView.loadUrl("javascript:console.log(android.getInput());");
}

public class AndroidInterface {
    @JavascriptInterface
    public String getInput() {
        return "FOO";
    }
}  

JS本身被执行得很好,所以做console.log('FOO');就像预期的那样打印FOO。但是一旦我尝试访问界面,我就会得到ReferenceError。任何想法?
提前谢谢!

2 个答案:

答案 0 :(得分:1)

可能是一些事情。您可以尝试以下方法缩小范围:

  • 在add和loadUrl之间插入一个睡眠(1秒绰绰有余)。 API不太可能是有争议的,但很容易检查。
  • 在调用loadUrl(“javascript:...”)之前加载页面。调用类似loadUrl("about:blank")loadData("<p>foo</p>", ...);的内容并稍微睡一觉。

调用loadUrl("javascript:...")在内部评估当前页面中的JavaScript,它不执行“真实”导航。可能是您正在添加的接口没有被执行loadUrl("javascript:...")调用的上下文拾取(特别是构建后WebView加载的'起始'页面有点特殊)并且执行导航使WebView“选择”新添加的界面。

答案 1 :(得分:0)

找到一个解决方法,知道它为什么不能在4.3上工作仍然会很有趣。

因此,我没有使用loadUrl,而是用一段HTML包围了JS并使用了loadData

webView.loadData("<!DOCTYPE html><html><head><script type=\"text/javascript\">function go(){console.log(android.getInput());}</script></head><body onload=\"javascript:go()\"></body></html", "text/html", "UTF-8");