Android与H5交互(java与js的交互)
一、理论概述
1.js调用java方法
直接调用WebView的该方法就可以添加接口了,不过先要启动交互
- // 启用javascript
- mWebView.getSettings().setJavaScriptEnabled(true);
- // 添加js交互接口
- public void addJavascriptInterface (Object object, String name)
object是js调用java类的对象,name是对象的别名,在js中可以用这个别名+点语法+方法名就可以调用本地的方法。
注意:被js调用的方法不可以定义成私有的,不然js就不能调用
2.java调用js方法
直接通过webView.loadUrl("javascript:jsFun('" + msg + "')")就行了.
假设js中有一个方法叫jsFun(msg),则这样就完成了调用
  // 调用js中的函数:jsFun(msg)
		  webView.loadUrl("javascript:jsFun('" + msg + "')");
二、消息处理
1、遇到Uncaught ReferenceError:...错误
出现该错误不会崩溃,它的意思是java调用js时没有找到调用的方法。万一我们调用的方法不存在,需要做相应的处理怎么办?尝试try ... catch ...抓取一下异常,发现什么都没有抓到...后来仔细看了一下错误Log的TAG,是Web Console,于是看了一下官方文档,终于发现了这么一个方法:
- mWebview.setWebChromeClient(new WebChromeClient() {
- @Override
- public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
- // TODO Auto-generated method stub
- if (consoleMessage.message().contains("Uncaught ReferenceError")) {
- // do something...
- }
- return super.onConsoleMessage(consoleMessage);
- }
- });
    这个方法可以监听WebView的控制台消息,然后判断一下消息是否包含“Uncaught ReferenceError”就可以捕获该消息了
2、获取js方法的返回值
仔细观察会发现WebView的loadUrl方法是没有返回值的,那要是想要获取js方法的返回值就该怎么做呢?查了一些资料,发现网上也没有很好的解决办法,后来只能通过回调的方法来实现返回,虽然很不灵活,不过也没有办法...
在loadUrl调用JS的一个方法,然后JS执行方法的时候,再调用Android本地的一个方法,并把返回值作为参数传递下来。
二、例子
1.Android java代码
//java代码
package com.wytiger.jsdemo;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.Toast;
/**
 * Android WebView 与 Javascript 交互。
 */
public class JsActivity extends Activity {
	private WebView webView;
@SuppressLint({ "SetJavaScriptEnabled", "AddJavascriptInterface" })
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_js2);
webView = (WebView) findViewById(R.id.webView);
		webView.setVerticalScrollbarOverlay(true);
		String uri = "file:///android_asset/js_test2.html";
		webView.loadUrl(uri);
		// 添加客户端支持
		webView.setWebChromeClient(new WebChromeClient());
// 设置WebView支持JavaScript
		webView.getSettings().setJavaScriptEnabled(true);
		//  添加js交互接口
		webView.addJavascriptInterface(new MyJava(this), "javaObject");
	}
private class MyJava {
		private Context mContext;
public MyJava(Context context) {
			this.mContext = context;
		}
// 在js中调用window.javaObject.javaFun(name),便会触发此方法。
		// api17版本以上加上注解
		@JavascriptInterface
		public void javaFun(String name) {
			Toast.makeText(mContext, "我是java方法,被js调用,js传递过来的参数是:"+name, 
					Toast.LENGTH_LONG).show();
		}
	}
// 在java中调用js代码
	public void callJs(View view) {
		String msg = ((EditText) findViewById(R.id.input_et)).getText()
				.toString();
		// 调用js中的函数:jsFun(msg)
		webView.loadUrl("javascript:jsFun('" + msg + "')");
	}
}
//布局文件
<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:focusable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical"
    android:padding="8dp"
    tools:context=".MainActivity">
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
<EditText
            android:id="@+id/input_et"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:layout_weight="1"
            android:hint="请输入信息" />
<Button
            android:text="Java调用js"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="callJs" />
    </LinearLayout>
<WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
2.H5 js代码,将此html文件放入assets文件夹即可
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-cn" />
<title>测试Android与H5交互(java与js的交互)</title>
<head>
<style>
  body {background-color:#e6e6e6}
  .rect
  {
    color:white;
    font-family:Verdana, Arial, Helvetica, sans-serif;
    font-size:16px;
    width:100px;
    padding:6px;
    background-color:#98bf21;
    text-decoration:none;
    text-align:center;
    border:none;
    cursor:pointer;
  }
.inputStyle {font-size:16px;padding:6px}
  </style>
</head>
<body>
  <p>这是html页面</p>
  <input id = "name_input" class = "inputStyle" type="text"/>
  <a class = "rect" onclick="sendInfoToJava()">js调用Java</a>
<script>
  function sendInfoToJava(){
    //js调用java方法,并传递参数
    var value = document.getElementById("name_input").value;
    window.javaObject.javaFun(value);
  }
//在java中调用此方法
  function jsFun(msg){
    alert("我是js方法,被java调用,传递过来的参数是:"+msg);
  }
  </script>
</body>
</html>
最后,推荐一个开源库:JsBridge
Android与H5交互(java与js的交互)的更多相关文章
- 安卓中java和js如何交互
		1.安卓中java和js如何交互 在Android上怎样实现JAVA和JS交互呢?Android的webview是基于webkit内核的,webview中集成了js与java互调的接口函数,通过add ... 
- android 与html交互java调js与js调java操作
		1.首先在项目下建一个assets目录(右击app->New->Folder->Assets Flolder),直接放在项目根目录下和res目录同级别(把所html,js,图片,cs ... 
- Android WebView加载本地html并实现Java与JS交互
		最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ... 
- java与js交互,相互调用传参
		随着前端技术的发展与H5的广泛使用,移动端采用native+h5的方式越来越多了,对于Android来说就涉及到java与js的交互,相互调用传参等.下面就来看一下java与js交互的简单demo. ... 
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
		前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ... 
- Android 与H5之间的js交互
		之前项目做过一些Android和Html5之间js交互方面的东西,今天有时间就总结一下: 一.为什么要进行js交互: 为了方便原生开发和Html之间数据传递,在静态页面的情况下可以改变原生开发的页面: ... 
- android webview js交互 第一节 (java和js交互)
		转载请注明出处 挺帅的移动开发专栏 http://blog.csdn.net/wangtingshuai/article/details/8631835 在androi ... 
- Android与H5交互
		1.初始化WebView控件 webView = (WebView) findViewById(R.id.webview); 2.设置WebView属性 WebSettings webSettings ... 
- Android开发学习之路--Java和Js互相调用
		随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和io ... 
随机推荐
- Flex4 vs Flex3: Repeater vs DataGroup
			repeaters太老土了!如果你过去使用过它,你会发出这种感概.现在,我们终于要摆脱它了.Repeaters不仅有沉重的组件,而且接合使用很不方便.那么,Flex 4中有什么可以帮助我们吗?Data ... 
- MySQL注射的过滤绕过技巧[1]
			SQL注射的绕过技巧较多,此文仅做一些简单的总结. 前文已经提到,最好利用的注射点: 支持Union 可报错 支持多行执行.可执行系统命令.可HTTP Request等额外有利条件 若非以上类型,则可 ... 
- 运用.net core配合VS 2015制作nuget包
			from:http://www.cnblogs.com/zeusro/p/5171084.html 运用.net core配合VS 2015制作nuget包 以往做nuget包我们一般要么用命令行,要 ... 
- Android入门篇1-Hello World
			一.android studio安装. 二.项目结构 三.运行流程 src->main->AndroidMainifest.xml注册HelloWorldActivity(intent-f ... 
- java.sql.preparedstatement和java.sql.statement的区别
			本文转自CSDN,然后整理了一遍.原文出处:CSDN JDBC(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.stateme ... 
- [转]nodejs npm常用命令
			FROM : http://www.cnblogs.com/linjiqin/p/3765772.html npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了n ... 
- android 获取当前系统时间
			取得系统时间 1. long time=System.currentTimeMillis(); 2. final Calendar mCalendar=Calendar.getInstance(); ... 
- scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例
			package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaA ... 
- 航空货运:运价类别Rate Class
			1.普通货物运价(1)基础运价(代号N -注:Normal的首字母)民航总局统一规定各航段货物基础运价为45公斤以下普通货物运价.(2)重量分界点运价(代号Q -注:Quantity的首字母)国内航 ... 
- CentOs下jdk的安装
			jdk的安装是咱搞java的基本功了,在window上配置了没上百次也有几十次了,今天换个环境,需要在linux系统上安装,而服务器版本的CentOs是纯命令行的, 因此也给配置jdk增加了不少难度, ... 
