Javascript接口在Android 4.2上无法工作。

22

我遇到了一个严重的问题,这个问题与安卓操作系统Jelly Bean 4.2有关。在我的程序中,我使用JavaScript来获取网页的高度,在安卓2.2到4.1版本中它能够正常工作,但是当我在安卓4.2中尝试使用相同的代码时,JavaScript接口就无法工作了。

请问我该如何解决这个问题?


1
你确定是 JavaScript 接口本身出了问题,而不是 JavaScript 命令(JS 解析错误)? - Kiran Kumar
实际上,我正在调用 JavaScript 函数,并且该函数在低于 17 版本的先前版本中被调用,但在 Android 4.2 API 级别 17 上无法正常工作。 - Ravi
你正在使用“loadUrl()”调用哪个JavaScript函数来获取高度? - Kiran Kumar
是的,我测试过从2.2到4.1版本都可以工作,但在Android 4.2上无法工作。 - Ravi
你正在调用哪个 JavaScript 命令? - Kiran Kumar
显示剩余2条评论
4个回答

46

根据 Android 4.2 文档:

注意: 如果您将 targetSdkVersion 设置为 17 或更高版本,则必须为任何想在您的网页代码中使用的方法添加 @JavascriptInterface 注释 (该方法还必须是 public 的). 如果您不提供注释,则在 Android 4.2 或更高版本上运行时,该方法将不可被您的网页访问.

来源: Android WebView 文档


1
非常感谢这个信息 :D自从我们升级了应用程序的API版本以来,我们一直陷入困境。 - Ethenyl
4
天啊!我简直不敢相信我花了这么长时间才找到这篇帖子。它应该会出现错误或其他提示,让我知道正在发生什么! - Richard
据称这可以修复早期 Android 版本中的某些安全漏洞,如在此处所述 - 但在我的测试中,示例代码会崩溃:https://dev59.com/_Gw15IYBdhLWcg3wv-ba - NoBugs

19

如果您正在使用Proguard,请记得添加以下内容:

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepattributes JavascriptInterface
-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { 
    <methods>; 
}

如果还不行,添加这个。
-keepattributes *Annotation*

注意:你的MyJavaScriptInterface必须是公共类
参考编号:Android Proguard Javascript接口失败

最终,这就是解决方案。即使将第一部分添加到proguard.cfg中似乎也不起作用(适用于Galaxy Note 3的Android 4.3),但关键似乎是“-keepattributes Annotation”部分。只要我将其添加到cfg中,它立即开始正常工作。非常感谢 :) - Sobakus
哦,我的天啊,谢谢你。你救了我11个小时的代码操作。 - hadi

8
根据文档:Android文档,从Android 4.2版本开始,你需要在你的方法前加上@JavascriptInterface注释(并且你的方法必须是public的)。

5

以下是适用于目标API 17+的Proguard配置,经过我的测试可以正常使用:

-keep @interface android.webkit.JavascriptInterface
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接