Android的WebView通过JS调用java代码

原创 2015年07月08日 14:04:51

做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录,那么就会跳转到登录页面(登陆页面是另一个Activity)。这个时候,一个简单的做法就是在按钮动作事件的js上调用java的方法,从而起到判断是否登录,并决定是否跳转到另一个页面。

 

Google的WebView为我们提供了 addJavascriptInterface(Object obj, String interfaceName)方法,这个方法的第一个参数是传给Web的对象,第二个参数是该对象的对象名。

 

写个简单的例子

 

复制代码
public class WebActivity extends Activity{

    ProgressBar mProgressBar;
    WebView mWebView;
    String mUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web);
        mWebView = (WebView) findViewById(R.id.web_view);
        mProgressBar = (ProgressBar) findViewById(R.id.loading_progress);
        doWebViewSetting();
//    加载网页
        loadUrl("http://172.10.1.2:8080/test");
    }

    private void doWebViewSetting(){
//   设置WebClient(可不要)
        mWebView.setWebViewClient(new MyWebViewClient());
//  支持js(必要)
        mWebView.getSettings().setJavaScriptEnabled(true);
//    添加js对象(必要)
        mWebView.addJavascriptInterface(new JsOperation(this), "client");
    }

    private void loadUrl(String url) {
        mUrl = url;
        mProgressBar.setVisibility(View.VISIBLE);
        mWebView.loadUrl(url);
    }


    class MyWebViewClient extends WebViewClient{
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            mProgressBar.setVisibility(View.GONE);
        }
    }
    class JsOperation {

        Activity mActivity;

        public JsOperation(Activity activity) {
            mActivity = activity;
        }

//    测试方法
       @javascriptInterface
        public void test() {
            Toast.makeText(mActivity,"test",Toast.LENGTH_SHORT).show();
        }
    }
复制代码

 

以上是我的WebActivity ,我这里只简单的实现的加载时进度条显示和提供对象给js。可以看出,我们提供了一个JsOperation 对象给web,然后在JsOperation 类中定义了test()方法。接下来就看看,Web方面要如何调用该方法。

 

复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>测试</title>
    <script type="text/javascript">
        function test(){
            client.test()
        }

    </script>
</head>
<body>
<br />
<button onclick="test()">test</button>
</body>
</html>
复制代码

 

web的实现方式特别简单,直接调用我们提供的对象,这里要注意的是,对象名是我们之前传入的String,这里是client,直接调用它的test()方法,就能弹出一个Toast了,当然你也可以在这个方法里做其他的各种处理,也可以提供多个方法,如果你需要传入参数,那么在java上定义好形参后,js上就正常的调用方法并传入参数,如client.test(param)就可以了,没什么特别要注意的地方。

 

特别注意:Android的WebView存在安全漏洞,因为js调用对象是可以通过反射再调用Runtime甚至可能以web挂马形式控制主机,google也承认webView这个功能太强了,给了web很大的权利,Android 4.2 (api17)已经开始采用新的接口方法,@JavascriptInterface  代替addjavascriptInterface, 但是低版本上是不能避免。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android中webview里js和java的相互调用--含代码demo解析

webview中js和java相互调用的实例代码 webview中js和Android代码相互调用 下面是个demo步骤 一,首先创建一个activity public class Js2JavaAc...
  • qiushi_1990
  • qiushi_1990
  • 2015年12月04日 09:35
  • 1321

Android之Webview使用Java代码和JS相互调用

本文主要记录一些零碎的东西 最近由于项目的需要,需要使用Java代码和JS相互调用,特此记录一点入门的东西,仅仅是入门而已 github: https://github.com/CL-window...
  • I_do_can
  • I_do_can
  • 2017年02月23日 20:25
  • 364

Android WebView JS不能调用Java对象的问题

webView.addJavascriptInterface(obj, "PersonalData");//前面
  • jjwwmlp456
  • jjwwmlp456
  • 2014年08月31日 00:22
  • 5012

Android WebView详解之JS调用Java方法

1、布局文件:只有一个WebView控件
  • c19344881x
  • c19344881x
  • 2015年01月07日 11:19
  • 6880

Android webview中Java调用javascript并获取返回值

Android中很多直接显示网页的需求,但是很错不单单只是显示网页就可以了,还需要与网页进行交互,就是所谓的Java与javascript交互。 如何实现: 实现Java和js交互十分便捷。通常只...
  • u010694658
  • u010694658
  • 2016年09月14日 15:57
  • 11067

WebView中JS无法调用Android接口的问题

关于WebView与HTML5交互的问题,这里不做详细讲解,有关Android WebView的使用,请查看此文章,讲解的灰常详细开发过程中,突然发现android能调用js方法,但是js方法调用an...
  • lupengfei1009
  • lupengfei1009
  • 2016年04月21日 16:39
  • 851

android webview不能调用JS中的function?

android webview不能调用JS中的function?
  • u010906636
  • u010906636
  • 2016年01月10日 23:11
  • 854

WebView---Android中调用js方法及js中调用本地方法

Android中内置了WebKit模块,而该模块的Java层视图类就是WebView,所有需要使用Web浏览器功能的Android都需要创建该视图类对象显示和处理请求的网络资源。目前WebKit支持H...
  • IT1039871366
  • IT1039871366
  • 2015年06月04日 17:07
  • 2250

android webview java调用js方法没反应

之前公司写了一个功能,需要调用H5界面,并且在H5界面里面调用本地方法获取照片,通过webview.loadUrl()方法再将照片流传给服务器。 本身呢,这个功能不是我做的,我对这块使用也并不是特别清...
  • waww116529
  • waww116529
  • 2016年10月18日 16:40
  • 1898

WebView中实现js与java互相调用

在Android项目中,经常会用到在Webview中js与java的互相调用。当然,Google官方为WebView提供了对应的方法,通过WebView.addJavascriptInterface(...
  • THEONE10211024
  • THEONE10211024
  • 2015年10月11日 23:38
  • 1953
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的WebView通过JS调用java代码
举报原因:
原因补充:

(最多只允许输入30个字)