2012-12-25 41 views
32

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

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

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 Console: Uncaught TypeError: Object [object Object] has no method 'handshake'

同样,这个相同的确切的事情工作正常的设备谁是hav e已经测试过的旧版android os(< 4.2.1)(最小版本是2.3.3)。

奇怪的是,如果我开始一个全新的项目,只有一个只有一个WebView的Activity,具有相同的代码,即使对于4.2.1,一切正常,但是当它是我的实际项目,事情打破。 没有任何我正在做的webview这是我没有提供的代码片段中。

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

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

回答

95

从Android 4.2的文档:

注意:如果您已经设置您的targetSdkVersion到17或更高,则必须将@JavascriptInterface注释添加到您要使用你的网页代码(必须方法的任何方法也是公开的)。如果您没有提供注释,那么在运行Android 4.2或更高版本时,您的网页无法访问该方法。

+0

另外,您必须设置minSdkVersion> = 17,即4.2,Jelly bean MR1。 除非,它会做@Nitzan-Tomer所描述的。造成这种行为的原因是Android安全问题。 –

4

您必须在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 
} } 

它为我工作。试试这个。

+0

您应该取出第一个'@JavascriptInterface',因为它在Android Studio中引发错误,它不适用于构造函数。 –

+0

谢谢@AlexanderBolinsky – Raghu