我正在使用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
。任何想法?
提前谢谢!
答案 0 :(得分:1)
可能是一些事情。您可以尝试以下方法缩小范围:
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");