Android 4.2.1、WebView 和 javascript 界面中断

IT技术 javascript android webview
2021-02-20 14:26:44

我有一个添加了 javascript 界面的 webview,它可以在大多数设备上完美运行,除了那些运行 Android 4.2.1 的设备。

我删除了大部分代码,并保留了一个非常基本的代码:

this.webView.getSettings().setJavaScriptEnabled(true);
this.webView.setWebChromeClient(new WebChromeClient());
this.webView.addJavascriptInterface(new Object() {
    public void handshake() {
        Log.d("JS", "handshake no params");
    }

    public void handshake(String json) {
        Log.d("JS", "handshake with params: " + json);
    }
}, "Android");

在 javascript 方面,测试代码如下所示:

Android.handshake();

但我在 logcat 中得到了这个:

E/Web 控制台:未捕获的类型错误:对象 [对象对象] 没有方法“握手”

同样,同样的事情在我测试过的具有较旧 android 操作系统(< 4.2.1)的设备中也能正常工作(最小版本为 2.3.3)。

奇怪的是,如果我开始一个全新的项目,只有一个只有一个 WebView 的 Activity,使用相同的代码,即使对于 4.2.1,一切都可以正常工作,但是当它成为我实际项目的一部分时,事情就坏了. 我没有对 webview 做任何事情,我提供的这个代码片段中没有包含它。

对我来说最奇怪的是 javascript 找到了 Android 对象,但它只是没有请求的方法(握手),这怎么可能?

任何帮助将不胜感激,因为这在过去 2 周左右一直让我发疯(这是我一直回到的错误,然后放弃等)。谢谢。

2个回答

来自 Android 4.2 文档:

注意:如果您已将 targetSdkVersion 设置为 17 或更高,则必须将 @JavascriptInterface 注释添加到您希望在网页代码中可用的任何方法(该方法也必须是公共的)。如果您不提供注释,则在 Android 4.2 或更高版本上运行时,您的网页将无法访问该方法。

另外,你必须设置minSdkVersion >= 17,也就是4.2,Jelly bean MR1。除非,它将完全按照@Nitzan-Tomer 的描述执行。这种行为的原因是因为 Android 安全问题。
2021-05-15 14:26:44

您必须在 Java 类中注释 (@JavascriptInterface) 方法,以便让 JavaScript 可用。

    public class JavaScriptInterface {
Context context;


JavaScriptInterface(Context c) {
    context = c;
}

@JavascriptInterface
public void edit(String postid) {
    Log.d("myApp", "EDIT!");
    //do stuff
}    }

它对我有用。试试这个。

您应该删除第一个“@JavascriptInterface”,因为它会在 Android Studio 中引发错误,表明它不适用于构造函数。
2021-04-29 14:26:44
谢谢@AlexanderBolinsky
2021-05-01 14:26:44