JavaScript接口无法查找功能

Bry*_*yan 5 javascript android typeerror chromium android-webview

我有一个JavaScriptInterface具有单一功能的类.该功能注释,@JavascriptInterface我相信我已正确设置.

public class JavaScriptInterface {

    ...

    @JavascriptInterface
    public void processBody(String uri, String body) {
        Log.d(TAG, "Process body");
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在上面设置JavaScriptEnabled WebView并尝试调用该函数:

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();
    }
});
Run Code Online (Sandbox Code Playgroud)

页面完成加载,然后我尝试了各种方法来调用我的JavaScript函数JavaScriptInterface.使用以下两种方法之一:

view.evaluateJavascript(javascript);

view.loadUrl("javascript:" + javascript);
Run Code Online (Sandbox Code Playgroud)

以及其中一个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);"
Run Code Online (Sandbox Code Playgroud)

每次我收到错误消息:

I/chromium: [INFO:CONSOLE(1)] "Uncaught TypeError: processBody is not a function", source: (1)
Run Code Online (Sandbox Code Playgroud)

虽然在较旧的设备(前KitKat)上错误消息从未显示,但该函数永远不会被调用.

此方法以前也一直在工作,我不相信我已经更改了此活动的任何代码.我今天早上才知道这个错误.

Mik*_*nov 5

正如我们已经了解到Bryan,问题是由于ProGuard剥离了未从Java调用的函数.一个快速而简单的测试是在Java中添加一些调用JS接口函数的代码,看看它是否有帮助.

有关如何配置ProGuard而不是去除注入Java对象的方法的信息,请参阅如何为javascript接口配置proguard?