Android 4.2.1、WebView 和 javascript 界面中断

Posted

技术标签:

【中文标题】Android 4.2.1、WebView 和 javascript 界面中断【英文标题】:Android 4.2.1, WebView and javascript interface breaks 【发布时间】:2012-12-11 11:35:46 【问题描述】:

我有一个添加了 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 控制台:未捕获的 TypeError:Object [object Object] 没有 方法“握手”

同样,同样的事情在我测试过的具有较旧 android 操作系统 (

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

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

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

【问题讨论】:

【参考方案1】:

来自 Android 4.2 文档:

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

【讨论】:

另外,必须设置 minSdkVersion >= 17,即 4.2,Jelly bean MR1。除非,它将完全按照@Nitzan-Tomer 的描述进行。此行为的原因是由于 Android 安全问题。【参考方案2】:

您必须在 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中抛出一个错误,它不适用于构造函数。 谢谢@AlexanderBolinsky

以上是关于Android 4.2.1、WebView 和 javascript 界面中断的主要内容,如果未能解决你的问题,请参考以下文章

android webview-android的webview怎么修改网页字体颜色和背景

Android 下的 WebView 中数据如何保存

Android webview加载的页面怎样调试JS

Android--WebView控件

Android Webview 和Javascript交互,实现Android和JavaScript相互调用

JS和Android交互