JavaScriptInterface not added on API 18



我使用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。什么好主意吗?
提前感谢!

可能有很多原因。您可以尝试以下方法来缩小范围:

  • 在add和loadUrl之间插入一个睡眠(1秒足够了)。这是不太可能的API是动态的,但它很容易检查。
  • 在调用loadUrl("javascript:…")之前加载页面。调用loadUrl("about:blank")loadData("<p>foo</p>", ...);之类的东西,然后睡一会儿。

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

找到了一个解决方案,仍然很想知道为什么它不能在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");

最新更新