WebView与js交互(2)

来源:互联网 发布:飞机水上迫降 知乎 编辑:程序博客网 时间:2024/05/22 13:13

开发中需要使用到WebView,这就牵扯到android 和 javascript的交互。

webSettings.setJavaScriptEnabled(true); //设置webview支持js
  1. android调用js代码(两种方式)

    实例:在android中调用javascript中的方法,将需要调用的js代码以.html格式放到src/main/assets文件夹中。(实际情况是:android更多的是调用远程js代码,那么将加载的js代码路径改成url即可)
    首先加载js代码,格式规定为:file:///android_asset/sev.html。

mWebView.loadUrl("file:///android_asset/sev.html");

然后在android中调用js代码,有两种方式:

一、

mWebView.loadUrl("javascript:callJsFunction()");    //callJsFunction()是定义在js中的方法

二、

mWebView.evaluateJavascript("javascript:callJsFunction()" , new ValueCallback<String>(){});

两种方式对比:

loadUrl :   简洁,任何版本都可以使用,效率低,获取返回值麻烦。使用场景:不需要获取返回值,对性能要求较低。evaluateJavascript: 效率高,向下兼容性差,只能在4.4以上使用。使用场景:android4.4以上。

2.js调用android代码(三种方式)

一、addJavascriptInterface

1.在android本地代码中定义类,如AndroidToJs,然后在类中定义可以被js调用的方法(方法上需要加@JavascriptInterface注解)

2.然后在android本地通过mWebView.addJavascriptInterface(new AndroidToJs(),”zidingyi”);方法将AndroidToJs对象注入到webview中,然后在js中可以通过注入的对象调用android本地方法。(注入的对象的引用是”zidingyi”)。

3.也就是在js中可以通过”zidingyi”这个引用来调用android本地方法。

二、通过WebViewClient的shouldOverrideUrlLoading()拦截url

WebView加载了html,在html上有按钮,点击后页面跳转,这时候可以拦截url。
点击html中按钮调用js方法
function androidJsOne(){
/假设url协议为:javasc://webview?arg1=1&arg2=2/
document.location = “javasc://webview?arg1=1&arg2=2”;
}

在android本地中shouldOverrideUrlLoading()拦截url:

Uri uri = Uri.parse(url);//根据协议的参数,判断是否是所需要的url, 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)// 如果url的协议 = 预先约定的 javasc 协议// 就解析往下解析参数                        if(uri.getScheme().equals("javasc")){    // 如果 authority  = 预先约定协议里的 webview,即代表都符合约定的协议    // 所以拦截url,下面JS开始调用Android需要的方法                 if(uri.getAuthority().equals("webview")){    Log.e("android与js交互","  shouldOverrideUrlLoading ()回调拦截 url");    //拦截后可以在协议上带上参数并传递到android端    HashMap<String,String> params = new HashMap<String, String>();    Set<String> set = uri.getQueryParameterNames();    for (String str: set) {        Log.e("android与js交互",""+str);    }}return true;}

三、通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

Android通过WebChromeClient 的onJsAlert(),onJsConfirm()、onJsPrompt()方法回调分别拦截JS对话框即上述三个方法),得到他们的消息内容,然后解析即可。

//当使用mWebView.loadUrl(“file:///android_asset/sev.html”)加载了上述JS代码后,就会触发回调onJsPrompt()
//如果是拦截警告框(即alert()),则触发回调onJsAlert();
//如果是拦截确认框(即confirm()),则触发回调onJsConfirm();

//参数message:代表prompt()的内容(而不是url)//参数result:代表输入框的返回值Uri uri = Uri.parse(message);// 如果url的协议 = 预先约定的 javasc 协议// 就解析往下解析参数if(uri.getScheme().equals("javasc")){    // 如果 authority  = 预先约定协议里的 webview,即代表都符合约定的协议    // 所以拦截url,下面JS开始调用Android需要的方法                 if (uri.getAuthority().equals("webview")) {        Log.e("android与js交互","  WebChromeClient回调拦截js的对话框");        //TODO                      }                   }

备注:

*常用的拦截是:拦截 JS的输入框(即prompt()方法)
*因为只有prompt()可以返回任意类型的值,操作最全面方便、更加灵活;而alert()对话框没有返回值;confirm()对话框只能返回两种状态(确定 / 取消)两个值。

0 0