Android WebView详解之JS调用Java方法

来源:互联网 发布:手机焓湿图计算软件 编辑:程序博客网 时间:2024/06/05 12:25

1、布局文件:只有一个WebView控件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <WebView        android:id="@+id/webView1"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>
2、Java界面实现
import android.annotation.SuppressLint;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.webkit.WebView;import android.webkit.WebViewClient;public class MainActivity extends Activity {private WebView webView;@SuppressLint("SetJavaScriptEnabled")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);webView = (WebView) findViewById(R.id.webView1);webView.getSettings().setJavaScriptEnabled(true);//JS映射webView.addJavascriptInterface(new WebHost(this), "js");webView.setWebViewClient(new WebViewClient(){      public boolean shouldOverrideUrlLoading(WebView view, String url) {                 view.loadUrl(url);                 return true;     }}); //显示本地静态页webView.loadUrl("file:///android_asset/www/login.html");}}
3、JS映射类

import android.content.Context;

import android.webkit.JavascriptInterface;import android.widget.Toast;public class WebHost {public Context context;public WebHost(Context context){this.context = context;}@JavascriptInterfacepublic void acllJs(){Toast.makeText(context, "点击了登录按钮!", Toast.LENGTH_SHORT).show();}}

注意:在被调用的方法名上面一定要加@JavascriptInterface。如果JS代码中访问Java中的函数,则您会用到WebView的addJavascriptInterface()函数。因为安全问题,在Android4.2中(如果应用的android:targetSdkVersion数值为17+)JS只能访问带有 @JavascriptInterface注解的Java函数。

4、静态页login.html代码:

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>文本输入框、密码输入框</title><script type="text/javascript">  function rec(){   js.acllJs();<!--js与前面映射的参数相同,acllJs()与映射类中的方法相同-->  }</script></head><body><form id="login"  method="post" action="main.html">账户:<input type="text"id="user" name="zh" value="1" /> <br>密码: <input type="password" id="pas" name="mm" value="2" /><br><input name="button" type="button" onClick="rec()" value="登录" /></form> </body></html>

源码下载

---------------------------------------------------------------------------------------------------------------------------------------------

有时会出现混淆打包失效问题,需要在proguard.cfg文件中添加

-keep public class com.cx.httpwebview.WebHost{public <methods>}

表示WebHost类下的所有方法不被混淆,这个方法还没有测试,这里只是做记录。


附录:

WebViewJavascriptBridge是移动UIView和Html交互通信的桥梁,他替代了WebView的自带的Javascriptinterface的接口,使得我们的开发更加灵活和安全。
对于安卓开发有一段时间的人来说,知道安卓4.4以前谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户端的重要信息,甚至轻而易举的调用本地代码进行流氓行为,谷歌后来发现有此漏洞后,增加了防御措施,如果要是js调用本地代码,开发者必须在代码申明JavascriptInterface,例如在4.0之前我们要使得webView加载js只需本文中介绍的方法。4.4之后调用需要在调用方法加入加入@JavascriptInterface注解,如果代码无此申明,那么也就无法使得js生效,也就是说这样就可以避免恶意网页利用js对安卓客户端的窃取和攻击。但是即使这样,我们很多时候需要在js记载本地代码的时候,要做一些判断和限制,或者有可能也会做些过滤和对用户友好提示,因此JavascriptInterface也就无法满足我们的需求了,特此有大神就写出了WebViewJavascriptBridge框架。

使用方法:
1.将jsBridge.jar引入到我们的工程,此jar包可以到gitHub上下载。
https://github.com/marcuswestin/WebViewJavascriptBridge
2.WebView包需使用以上包的webView

2 0
原创粉丝点击