【发布时间】:2016-01-29 15:42:33
【问题描述】:
我有一个具有单一功能的 JavaScriptInterface 类。该函数带有@JavascriptInterface 注释,我相信我已经正确设置了它。
public class JavaScriptInterface {
...
@JavascriptInterface
public void processBody(String uri, String body) {
Log.d(TAG, "Process body");
...
}
}
然后我在 WebView 上设置 JavaScriptEnabled 并尝试调用该函数:
final WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "java");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
Log.d(TAG, "Page finished");
callJavaScript();
}
});
页面加载完成,然后我尝试了多种方法从我的JavaScriptInterface 调用 JavaScript 函数。使用以下两种方法之一:
view.evaluateJavascript(javascript);
view.loadUrl("javascript:" + javascript);
还有这些 javascript 字符串之一:
"(function() { window.java.processBody('" + url + "', document.body.innerHTML); })()"
"(function() { processBody('" + url + "', document.body.innerHTML); })()"
"window.java.processBody('" + url + "', document.body.innerHTML);"
"processBody('" + url + "', document.body.innerHTML);"
每次我收到错误信息时:
I/chromium: [INFO:CONSOLE(1)] "Uncaught TypeError: processBody is not a function", source: (1)
虽然在旧设备(KitKat 之前)上,错误消息永远不会出现,但函数永远不会被调用。
此方法以前也有效,我不相信我已更改此活动的任何代码。我今天早上才知道这个错误。
【问题讨论】:
-
您在为您的应用程序使用 ProGuard 吗?它可以去除不是从 Java 调用的函数。一个简单的测试是在 Java 中添加一些调用您的函数的代码,看看它是否有帮助。
-
@MikhailNaganov 啊!我是。我一定是重构了我的
JavaScriptInterface的位置!我没有想到这一点,我讨厌 ProGuard 不遵循重构代码!谢谢,发布一个答案,以便我将其标记为正确。
标签: javascript android android-webview chromium typeerror