WebView与js交互(2)
来源:互联网 发布:飞机水上迫降 知乎 编辑:程序博客网 时间:2024/05/22 13:13
开发中需要使用到WebView,这就牵扯到android 和 javascript的交互。
webSettings.setJavaScriptEnabled(true); //设置webview支持js
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()对话框只能返回两种状态(确定 / 取消)两个值。
- webview与js交互2
- WebView与js交互(2)
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- WebView与JS交互
- webView与js交互
- webView与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- webview与js交互
- WebView与JS交互
- webview与js交互
- Webview 与JS 交互
- OpenLayers+天地图+Geoserver+WMS图层服务
- 搭建Struts2步骤
- SVM浅析
- HITCTF PWN300--dynelf
- 懂商业的技术合伙人(8):最常见的11种云服务
- WebView与js交互(2)
- 每天一个Linux命令(14):head
- 导入项目报的错(集合)
- C++数组的内存模型分析
- C语言循环结构简单练习1——输出九九乘法表
- 继承
- java跨平台原理
- MySQL查询语句练习题
- AsyncTask 网络传输