WebView中Java与JavaScript的交互
原文首发于微信公众号:jzman-blog,欢迎关注交流!
Android 开发过程中 WebView 的使用比较广泛,常用来加载网页,比如使用 WebView 加载新闻页面、使用 WebView 打开本应用的链接以及用 WebView 显示支付信息页面等,那么如何 Android 开发中如何与 WebView 中的内容进行交互呢,这种交互主要就是 Java 与 JavaScript 之间的互相调用。下面实现一下如何响应 WebView 中图片的点击事件:
- 关键方法
- 具体实现
- 显示效果
关键方法
1. setJavaScriptEnabled()
设置 WebView 是否支持 JavaScript 脚本,默认不支持。
public abstract void setJavaScriptEnabled(boolean flag);
2. addJavascriptInterface()
注入 Java 对象到 WebView 中,该对象将会被注入到 JavaScript 主框架的上下文中,允许使用映射的 Java 对象的名称从 JavaScript 访问该对象的方法,且只可以访问添加 @JavascriptInterface 注解的公共方法才可以从 JavaScript 中访问,可在 API level 17 以上使用这样使用。
如果 API level 16 以及更早的 API, 所有的公共方法(包括继承的)都可以从 JavaScript 访问,可能会出现页面重新加载前,Java 对象还未注入到 JavaScript 中的情况,导致调用 Java 方法无效果。
重要声明:该方法允许 JavaScript 控制应用程序,功能非常强大,但是如果 API level 16及更早的 API 版本将会存在一定的风险,比较安全的做法是该方法尽量在 Android 4.2 及以上版本使用该方法,如果是更低的版本 JavaScript 可以使用反射来访问所注入对象的公共字段,在 WebView 中使用该方法可能会有不受信任的内容被攻击者利用,让应用程序去执行 Java 代码,要注意线程安全,Java 对象的字段不可访问,Android 5.0 以上,所注入的 Java 对象的方法是有一定数量限制的。
public void addJavascriptInterface(Object object, String name) {}
具体实现
大致思路就是让 WebView 中的图片响应点击事件,然后调用 Android 界面来显示被点击的图片,实现步骤如下:
- WebView 设置支持 JavaScript 脚本;
- 创建与 JavaScrpt 通信的类及供 JavaScript 调用的方法;
- 加载 WebView 中要显示的内容;
- 使用 addJavascriptInterface 方法将 Java 对象映射到 JavaScript 中;
- 在 JavaScript 中调用映射对象的方法,打开显示图片的 Activity;
- 调用 javaScript 中的方法。
第一步:
WebView 设置支持 JavaScript 脚本,如下:
//设置支持JavaScript
webSettings.setJavaScriptEnabled(true);
第二步:
创建与 JavaScrpt 通信的类及供 JavaScript 调用的方法,如下:
/**
* 与 javascript 通信的 Java 对象,提供 javascript 调用的方法
* Created by jzman on 2017/7/20 0020.
*/
public class AndroidInterface {
private Context context;
public AndroidInterface(Context context) {
this.context = context;
}
/**
* 添加注解 @JavascriptInterface
* javascript 要调用的方法
*/
@JavascriptInterface
public void showImage(String imgUrl){
Intent intent = new Intent();
intent.putExtra("img",imgUrl);
intent.setClass(context,ImageActivity.class);
context.startActivity(intent);
}
}
第三步:
加载 WebView 要显示的内容,这里加载 aasets 目录下的 HTML 文件,如下:
//加载 assets 目录下的 HTML 文件
webView.loadUrl("file:///android_asset/index.html");
第四步:
使用 addJavascriptInterface 方法将 Java 对象映射到 JavaScript 中,如下:
//注入Java对象并映射到JavaScript中
//参数(与JaveScript通信的对象,映射到JavaScript中的对象)
webView.addJavascriptInterface(new AndroidInterface(this),"imageListener");
第五步:
在 JavaScript 中查找 标签并在其点击事件里面调用其映射对象的方法打开显示图片的 Activity,如下:
<script type="text/javascript">
function findImg(){
//查找img标签
var imgs = document.getElementsByTagName("img");
//遍历img标签
for(var i=0; i<imgs.length; i++){
//为每一个标签设置点击事件
imgs[i].onclick = function(){
//imageListener映射的Java对象
window.imageListener.showImage(this.src);
}
}
}
</script>
第六步:
调用 JavaScript 里面的方法,为保证调用时 Java 对象还未注入到 JavaScript 中,应该页面加载完成时调用 javaScript 的方法,如下:
//设置 WebViewClient 监听相关事件
webView.setWebViewClient(new WebViewClient(){
//页面加载完成回调该方法
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//保证页面加载完成后Java对象注入到JavaScript中
webView.loadUrl("javascript:findImg()");
}
});
显示效果

源码请参考:github
可以关注公众号:jzman-blog,一起交流学习。

WebView中Java与JavaScript的交互的更多相关文章
- Android中Java与JavaScript之间交互(转)
Android代码: package com.fyfeng.testjavascript; import android.app.Activity; import android.content.In ...
- android webview与 java与javascript的交互
webView.getSettings().setJavaScriptEnabled(true);//打开就可以用js的功能 webView.getSettings().setJavaScript ...
- 安卓中java和js如何交互
1.安卓中java和js如何交互 在Android上怎样实现JAVA和JS交互呢?Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过add ...
- webview中java与js交互
WebView提供了在Android应用中展示网页的强大功能.也是目前Hybird app的大力发展的基础.作为Android系统的一个非常重要的组件,它提供两方面的强大的能力:对HTML的解析,布局 ...
- 让Java和JavaScript进行交互
本篇博文参考自:http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/ 我们在使 ...
- Android WebView 总结 —— Java和JavaScript交互
交互如何实现 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互接口. 客户端和网页端编写调用对方 ...
- Android 中Java和JavaScript交互入门
如何实现JavaScript 和java 交互 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互 ...
- Android中Java和JavaScript交互
Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本.本文将介绍如何实现Java代码和Javascript代码的相互调用. 如 ...
- C#中webbrowser与javascript(js)交互的方法
今天在做一个项目的时候需要用c#搞一个webbrowser,然后有些地方还需要与js交互.所以就查了一下资料,发现很多博客提到了但是却没有说下具体的操作.所以我就写一下. 开发环境是Visual St ...
随机推荐
- 如何使用API提交转码任务?
摘要: 当常规的转码工作流无法满足用户的场景时,需用户自己判断业务逻辑,并使用API提交转码任务.例如:并不是所有的视频都需要转码,不同视频需要设置不同的转码配置.本文将介绍API提交转码任务的方法. ...
- DIV的失去焦点(blur)实现
用防抖实现DIV鼠标移出消失 由于div标签本身不支持onblur事件,所以对于点击一个按钮弹出的div,我们想要当这个div失去焦点的时候,让它消失不能使用的onblur来实现. 但是可以利用 ...
- Jsp页面中动态的引入另一个jsp,jsp:include路径是变量的实现
1 问题描述 在页面搭建时,会有这样的需求,希望局部页面动态的引用另一个jsp.这里的"动态"的意思引用的jsp的路径是个变量.举个例子,我们希望局部页面可能是page1.jsp或 ...
- leetcode 249 250 set和map的简单用法
leetcode249,利用了STL中的set class Solution { public: vector<int> intersection(vector<int>&am ...
- arm 添加 samb 文件共享
编译环境: ubunto 12 arm-linux-gcc 4.3.2 arm linux 4.1.36 开发板 2440 测试上传速度,大文件 github源码 https://github.com ...
- JavaFX之FXML+CSS创建窗体以及透明窗体添加阴影
前言 开通博客园有一段日子了,一直没空也没想好该写点什么.最近正好在做一个桌面程序,初次接触JavaFX,体验下来确实比swing好用不少.索性便记记学习笔记吧,虽然FX好像挺没存在感,没人用的感觉. ...
- web安全测试(上)
前情提要: 公司的安全测试一直是安全部经理全权负责,测试部只做功能和自动化. 但是2019是公司业绩腾飞的一年,业务量越来越大了,安全部经理实在做不过来. 于是他给整个测试部培训<安全测试> ...
- vue基础 ref的作用
1. ref 获取dom元素,除了能获取dom元素也能获取组件dom, 组件通信: 在父组件中直接调用ref定义的组件的数据或者方法 <div id="app&qu ...
- mysql的那些事之架构
MySQL架构的那些事 此篇博客为原创,欢迎转载,转载时请注明出处,谢谢 最近深入学习了一下mysql的内容,想把自己的理解分享出来. mysql架构 逻辑架构 Connectors:连接器 Mana ...
- D2T1服务器需求——毒?瘤题(并不是
这题我第一眼居然差点错了\(OTZ\) 然后写了线段树,还写挂了-- 写好了\(query\)操作,发现似乎不需要区间查询,然后又删掉-- 看着这熟悉的操作,似乎在哪里见过-- 然后我莫名其妙把一个\ ...