WebView调用js方法获取返回值的完美解决方案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/k_bb_666/article/details/86673983

在Android项目中我们或多或少会涉及到与js交互的问题,这其中WebView是必须掌握的控件,今天主要说说我们通过WebView调用js方法,然后如何很好的获取返回值。这里我总结了三种方式,大家可根据需求选择。

一、Android版本在4.4及以上

mWebView.evaluateJavascript("javascript:jsMethod()", new ValueCallback<String>() {
                        @Override
                        public void onReceiveValue(String value) {
                            //value即为js返回值
                        }
                    });

如果你项目最低支持版本在4.4以上,那这种方式最简单最完美,否则会报以下警告:

Call requires API level 19 (current min is 14): android.webkit.WebView#evaluateJavascript

二、Android4.4以下版本

虽说现在4.4以下版本不多了,但是只要存在,我们就需要努力兼容。

第一步,利用WebView的loadUrl()方法,调用js的alert方法,

mWebView().loadUrl("javascript:alert(jsMethod())");

第二步,在alert回调中的message就是我们想要的返回值

mWebView.setWebChromeClient(
      new WebChromeClient() {
          @Override
          public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
          //message即为返回值
          result.confirm();
          return true;
   }
);

返回值虽然拿到了,但是这种方法缺点挺多的:

1、不能忘记在回调中调用result.confirm,否则webview会出现奇怪的不可控现象,大家可以去掉试试;

2、onJsAlert方法要return true,表示我们自己处理alert,不需要js管啦;

3、js在alert方法中别return一个值回来,否则也会出现奇怪现象;

4、在华为Android版本8.0以上的某些机型中,会出现无法拦截js的alert,会直接将js的alert弹框弹出,很难受。。。

三、最稳妥的方法

这种方法需要和js协调好,双方配合完成:

1、我们同样利用WebView的loadUrl()方法,调用js普通方法

mWebView().loadUrl("javascript:jsMethod()");

2、给js注入一个方法,且加入参数,并和js开发人员约定,当我们调用其第一步中的jsMethod方法,他调用我们注入的方法,并将返回值传回

mWebView().addJavascriptInterface(this, "viewpager");

@JavascriptInterface
public void getResult(String str) {
    //str 即为返回值
}

OK!搞定啦,到此你就可以开心的与js交互,并拿到他的返回值啦!希望我的总结可以帮助到你~

展开阅读全文

没有更多推荐了,返回首页