我有一个只有一个函数的 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 之前)上错误消息永远不会出现,但函数永远不会被调用。
此方法之前也一直有效,我认为我没有更改此 Activity 的任何代码。我今天早上才知道这个错误。
最佳答案
正如我们与 Bryan 一起发现的那样,问题是由于 ProGuard 剥离了不是从 Java 调用的函数。一个快速简单的测试是在 Java 中添加一些调用 JS 接口(interface)函数的代码,看看是否有帮助。
有关如何配置 ProGuard 以不去除注入(inject)的 Java 对象的方法的信息,请参阅 How to configure proguard for javascript interface?
关于JavaScript 接口(interface)找不到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35088387/