JavaScriptInterface未添加到API 18上

JavaScriptInterface未添加到API 18上,javascript,android,android-webview,Javascript,Android,Android Webview,我正在使用WebView在我的应用程序中执行一些JS代码。到目前为止,这在我的KitKat(targetSdk)设备和2.2(minSdk)仿真器上运行良好。 不过,在4.3Nexus7上,我遇到了一个错误。似乎JS对象没有被注入 uncaughtreferenceerror:android未定义为null:1 下面是我的代码的精简版本: public void getData(Context ctx) { WebView webView = new WebView(ctx);

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

uncaughtreferenceerror:android未定义为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
。有什么想法吗?

提前谢谢

找到了一个解决方法,如果知道它为什么不能在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");

webView.loadData(“function go(){console.log(android.getInput());}可以是很多东西。您可以尝试以下方法来缩小范围:

  • 在add和loadUrl之间插入一个sleep(1秒就足够了)。虽然API不太可能是快速的,但很容易检查
  • 在调用loadUrl(“javascript:…”)之前加载一个页面。调用类似于
    loadUrl(“about:blank”)
    loadData(“foo

    ”,…);
    的内容,然后睡一会儿

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

+1这很可能是原因。我想知道为什么它只出现在API 18上。我猜他们在两者之间做了一些更改。我现在无法再测试它,因为我必须返回有问题的平板电脑。我可以想象,虽然加载空白页面实际上可以工作,因为这与我在描述的工作区中所做的工作大致相同嗯。