安卓webview和js+html交互利用的addJavascriptInterface和webview.loadUrl("javascript:**");

近期做一个项目需要把一个 服务支持的界面用webview来显示..呀 html白雪了js更是一样啥也不会,相信很多初学屌丝员跟我一样,,

html开发工具都不知道怎么写..哈哈哈.....现在把做完的结果分享一下先上图了

,,

这是从项目中特意分离出来的demo这里之上一些关键代码

源码下载地址  http://download.csdn.net/download/yung7086/7554309

步骤 首先在assets目录下建一个html文件

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
        <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8" /> 

<script type="text/javascript">
function createTable(phon){
   var table = document.getElementById("table");
   var arrya=phon.split(";");
   var rowindex=0;
  for(var i=0;i<arrya.length;i++){
         var  child= arrya[i].split(",");
         var row = table.insertRow(rowindex);//创建一行
         rowindex+=1;
         var cell1 = row.insertCell();//创建一个单元
         cell1.innerHTML=child[0];
          var cell2 = row.insertCell();//创建一个单元
         cell2.innerHTML="("+i+")";

        for(var n=1;n<child.length;n++){
             var row = table.insertRow(rowindex);//创建一行
             rowindex+=1;
             var cell1 = row.insertCell();//创建一个单元
           if(i==0){
              cell1.innerHTML= "<a href='javascript:Android.callPhone(\""+child[n]+"\")'>" +child[n];
           }else if(i==1){
             cell1.innerHTML= "<img src=\"file:///android_asset/qqicon.png\" height=\"14\" width=\"16\" > "+ "<a href='javascript:Android.callQQ(\""+child[n]+"\")'>" +child[n];
           }else if(i==2){
             cell1.innerHTML= "<img src=\"file:///android_asset/wxicon.png\" height=\"12\" width=\"16\" > "+ "<a href='javascript:Android.callWeixin(\""+child[n]+"\")'>" +child[n];
           }
           var cell2 = row.insertCell();
         }
     }
 }
</script>
 </head>
 <body>

 <font color="#0099FF" size="5"> 服务支持</font> </p>

<table id="table" >
</table>
</p></p></p></p></p>

 <font color="#233fF1" size="2">
 PS:</p>
以上连接可以点击进入QQ或者微信程序,界面的电话号码QQ号码都是从服务器获取,获取的数据直接保存在应用的私有目录下,然后从该目录取出数据通过java类调用js填充到html上,html根据绑定的java对象调用java类的方法实现拨打电话,, 转载请标明出处
</p> 尊重作者 @author yung7086
</p> 2014年6月26日 11:25:46</font>
 </body>
</html>

玩这个都玩了好久应为直接是eclipse开发 写一个function写了N遍老师少了逗号大括号还不报错。。。。郁闷的求推荐html+js的开发工具

算了还是整片的贴出来吧..html需要调用拨打电话这些功能就需要调用java类了这里我就需要定义一个java类实现html需要调用的方法

package com.example.jsdemo;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.webkit.JavascriptInterface;

/**
 * JS的调用的方法
 *
 * @author yung
 *         <p>
 *         2014年6月24日 09:26:14
 *         <p>
 *         此类中的打开的QQ 和微信是直接通过包名和类名调用虽然QQ微信包名不容易变 但是主界面好事可能会变
 *         如果发现打不开QQ微信应用可以查看是否是QQ微信升级更改了类名
 */
public class AndroidJavaScript {

	Context c;
	String[] qqpackage = new String[] { "com.tencent.mobileqq",
			"com.tencent.mobileqq.activity.SplashActivity" };
	String[] wxpackage = new String[] { "com.tencent.mm",
			"com.tencent.mm.ui.LauncherUI" };

	public AndroidJavaScript(Context c) {
		this.c = c;
	}

	@JavascriptInterface
	public void callPhone(final String telphone) {

		Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
				+ telphone));
		c.startActivity(intent);

	}

	@JavascriptInterface
	public void callQQ(String qq) {
		// 实现调用电话号码

		if (!checkBrowser(qqpackage[0])) {

		} else {
			Intent intent = new Intent();
			ComponentName cmp = new ComponentName(qqpackage[0], qqpackage[1]);
			intent.setAction(Intent.ACTION_MAIN);
			intent.addCategory(Intent.CATEGORY_LAUNCHER);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent.setComponent(cmp);
			c.startActivity(intent);
		}

	}

	@JavascriptInterface
	public void callWeixin(String weixin) {

		if (!checkBrowser(wxpackage[0])) {

		} else {
			Intent intent = new Intent();
			ComponentName cmp = new ComponentName(wxpackage[0], wxpackage[1]);
			intent.setAction(Intent.ACTION_MAIN);
			intent.addCategory(Intent.CATEGORY_LAUNCHER);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent.setComponent(cmp);
			c.startActivity(intent);

		}

	}

	// 获取在webview上获取js生成的html的源码
	@JavascriptInterface
	public void getSource(String htmlstr) {
		// Log.e("html", htmlstr);
		// String path = c.getFilesDir().getAbsolutePath() + "/serve.html"; //
		// data/data目录

	}
        //检测包名的应用是否已经安装在手机
	public boolean checkBrowser(String packageName) {
		if (packageName == null || "".equals(packageName))
			return false;
		try {
			ApplicationInfo info = c.getPackageManager().getApplicationInfo(
					packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
			return true;
		} catch (NameNotFoundException e) {
			return false;
		}
	}
}

现在有了方法有了html就差怎么调用了这样记得设置webview必要是参数

myWebView.addJavascriptInterface(new AndroidJavaScript(this), "Android");

你是否发现html的js方法里面有酱紫的语句

<a href=‘javascript:Android.callWeixin(\""+child[n]+"\")‘>"

确实这里面的”Android和“myWebView.addJavascriptInterface(new AndroidJavaScript(this), "Android");必须相同哦..

这里注意双引号哈

WebSettings webSettings = myWebView.getSettings();
		webSettings.setJavaScriptEnabled(true);
		isExistsHTML();
		// myWebView.loadUrl("file:///android_asset/ss.html");
		String path = getFilesDir().getAbsolutePath() + HTMLNAME; // data/data目录
		myWebView.loadUrl("file:///" + path);
		myWebView.addJavascriptInterface(new AndroidJavaScript(this), "Android");

		// myWebView.loadUrl("javascript:getStr('" + 122222 + "')");
		myWebView.setWebViewClient(webviewcilnt);

好把这里就解决了html里面调用java类实现的方法,,

下面说说 我这些QQ号和电话是从服务器获取的怎么添加到html上去。。这就是js的任务了

你看到我的html是没有什么布局,数据都是js生成出来的界面,。

怎么从java传到js里面呢  ?在java里面写myWebView.loadUrl("javascript:createTable(‘" + phon + "‘)");啦.

createTable(”“);就是js的function名字.记住这个myWebView.loadUrl("javascript:createTable(‘" + phon + "‘)")

在onCreate加应该是不行的需要酱紫

	myWebView.setWebViewClient(webviewcilnt);
WebViewClient webviewcilnt = new WebViewClient() {
		@Override
		public void onReceivedError(WebView view, int errorCode,
				String description, String failingUrl) {

		}

		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			String phon = loadHTMLData();
			myWebView.loadUrl("javascript:createTable('" + phon + "')");
			// 获取webview加载的html页面
			view.loadUrl("javascript:window.Android.getSource('<html>'+"
					+ "document.getElementsByTagName('html')[0].innerHTML+'</html>');");

		}

		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
		}
	};

等待webview初始化html完成之后在调用js呵呵就这样啦转载请标明出处

尊重作者 yung7086

安卓webview和js+html交互利用的addJavascriptInterface和webview.loadUrl("javascript:**");,布布扣,bubuko.com

时间: 2024-10-13 16:03:18

安卓webview和js+html交互利用的addJavascriptInterface和webview.loadUrl("javascript:**");的相关文章

webview与JS的交互

一:hybird app, web app 和 native app 的区别   Web App Hybird App 混合Native App 开发成本 低 中 高 维护更新 简单 简单 复杂 体验 差 优 优 跨平台 优 优 差 Native App是一种基于智能手机本地操作系统如IOS,Android等并运用原生程序编写运行的第三方运用程序,也叫本地App. Web App 是针对Iphone,Android优化后的web站点,前端使用的技术是:html5,css,javascript等,

android webview和js的交互

第一步: mainfest.xml中加入网络权限 <use-permission android:name="android.permission.INTERNET"/> 如果是访问本地的那就不需要加这个权限了 第二步: 加载本地写好的html文件(定义好js中提供给android调用的方法funFromjs(),和android提供给js调用的对象接口) fun1FromAndroid(String name)),放在assets目录下. eg. <body>

JsBrage -- App中WebView与JS的交互桥梁

在Hybrid App中网页都是显示在原生的WebView中,js与原生通信都是靠WebView提供的支持方式来实现的,而将这个实现方式抽象封装出来的模块,就是JsBrage. Android: 对于Android调用JS代码的方法有2种: 1. 通过WebView的loadUrl(),目前项目中用的这种方式 mWebView.loadUrl("file:///android_asset/javascript.html"); mWebView.loadUrl("javascr

背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(WebView) 加载指定 HttpMethod 的请求 自定义请求的 http header app 与 js 的交互 示例1.演示 WebView 如何加载指定 HttpMethod 的请求以及如何自定义请求的 http headerWebApi/Controllers/WebViewPostController.cs /* * 用于 WebView 演示“如何加载指定 HttpMethod 的请求,以及如何自

浅谈webview与js交互

浅谈下webview与js的交互,项目中因为需要获取页面中的许多属性,所以用到了这些,让后端在方法中传了过来. 下面的demo是本地的html代码,具体可以仿写,都差不多,注重思想. 1:项目目录 2:jump的代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <script type="text/

浅谈混合开发与Android,JS数据交互

本文是作者原创,如转载请注明出处! 一.概论 现在时代已经走过了移动互联网的超级火爆阶段,市场上移动开发人员已经趋于饱和,显然,只会原生APP的开发已不能满足市场的需求,随着H5的兴起与火爆,H5在原生APP中的使用越来越广泛,也就是我们常说的混合开发(Hybrid APP).最新很火的微信小程序相信大家都是知道的,实际上微信小程序加载的界面就是一个HTML5的界面,HTML5界面在一些电商类的APP中主要承担展示数据的作用,但是他的作用并不仅限于此,最起码js调用原生方法和原生调用js的方法是

iOS开发日记27-WebView与JS的交互

今天博主有一个WebView与JS的交互的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. WebView与JS的交互分为两种种方式:1.在OC中调用JS 2.在JS中调用OC 网页试用[NSString stringWithFormat:@"http://cn.bing.com"] 一.在OC中调用JS 直接上代码 -(void)webViewDidFinishLoad:(UIWebView *)webView { //    NSString *docStr=[webVi

WebView与JS的几种交互

http://www.jianshu.com/p/0042d8eb67c0 最近整理了一下原生与H5之间的交互方式,简单的做个总结.OC端与JS的交互,大致有这几种:拦截协议.JavaScriptCore库.WKWebView.自定义NSURLProtocol拦截.WebViewJavascriptBridge. JavaScriptCore一个iOS7引进的标准库,iOS7以前也有开发者自行导入使用.Web端也比较容易统一. WebViewJavascriptBridge是一个第三方库,其原理

Android中webview和js之间的交互(转)

http://www.cnblogs.com/leizhenzi/archive/2011/06/29/2093636.html 1.android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示: mWebView.getSettings().setJavaScriptEnabled(true); mWebV