我使用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");