Android WebView 中 addJavascriptInterface 接口无效问题

本文记录了在Android开发中遇到的一个问题:在WebView中使用addJavascriptInterface进行Java与Javascript交互时遇到的接口无效问题。文章指出,必须启用WebView的Javascript支持,并且从JELLY_BEAN_MR1版本开始,只有public且添加了@JavascriptInterface注解的方法才能被调用。此外,还强调了Javascript与Java交互发生在子线程中,需要注意线程安全和不同Android版本对WebView的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说点题外话吧,从 Cocos2d-x 技术支持部门调到 Cocos Play 部门已经不知觉半年了。半年中,大概一天都是当成两天来用,完全没有时间做点自己的事情。最近正统的 Andorid 代码已经写的很少写了,倒是 C++, Python 写的飞起,踩过的坑,流过的类也是不计其数。今天难得可以抽点时间写写 Android 代码,没想到又是一个坑,好吧,既然让我遇到了,就顺便记录下来吧。

Java 与 Javascript 交互

最近遇到这样一个需求,Android 程序中需要使用 WebView 来加载一个网页,而这个网页会根据请求的参数正确与否返回不同的内容。当请求参数正确,则返回正常显示的 HTML 页面。如果请求参数错误,直接返回 json。

所以,我们必须通过 WebView 来对页面内容做出区分,如果是正常的页面内容则显示,反之,则解析其中的 json。我们知道,WebView 提供了一个接口,可以让我们注入 Java 对象到页面中,这样,页面中的 javascript 就能直接访问 Java 对象的接口,从而实现 Java 和 Javascript 的交互。

首先必须启用 WebView 中的 Javascript 支持。

webView.getSettings().setJavaScriptEnabled(true);

注入 Java 对象到 WebView 中。

webView.addJavascriptInterface(new JavascriptHandler(), "handler");

Java 对象定义如下,需要特别注意的是,在 JELLY_BEAN_MR1 之后,只有 public 且添加了 @JavascriptInterface 注解的方法才能被调用。这也是为了安全考虑。毕竟页面可以直接操作 Native Application 有点太可怕了。(没加注解,导致反射无效,查了好久也是醉了)

class JavascriptHandler {
    @JavascriptInterface
    public void getContent(String htmlContent){
        Log.i(TAG, "html content:" + htmlContent);
}

最后,在 WebView 载入完成后的回调方法中调用如下方法就能获得网页的内容了。

 @Override
public void onPageFinished(WebView view, String url) {
    view.loadUrl("javascript:window.handler.getContent(document.body.innerHTML);");
    super.onPageFinished(view, url);
}

IMPORTANT

  • Javascript 和 Java 的交互是在子线程中的,必须注意线程安全
  • Java 对象中的成员方法不再能直接访问
  • For applications targeted to API level LOLLIPOP and above, methods of injected Java objects are enumerable from JavaScript. (目前还不知道官方文档中的这句话代表了什么)
  • 特别需要注意 Android 各个版本对 WebView 的要求导致的。越高的版本对 WebView 的限制更加严格。

References

http://developer.android.com/reference/android/webkit/WebView.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值