安卓webview和js+html互動利用的addJavascriptInterface和webview.loadUrl("javascript:**");
近期做一個專案需要把一個 服務支援的介面用webview來顯示..呀 html白雪了js更是一樣啥也不會,相信很多初學屌絲員跟我一樣,,
html開發工具都不知道怎麼寫..哈哈哈.....現在把做完的結果分享一下先上圖了
,,
這是從專案中特意分離出來的demo這裡之上一些關鍵程式碼
步驟 首先在assets目錄下建一個html檔案
[html] view plain copy print?- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <metahttp-equiv="Content-Type"content="text/xhtml; charset=utf-8"/>
- <scripttype="text/javascript">
- function createTable(phon){
- var table = document.getElementById("table");
- var arrya=phon.split(";");
- var rowindex=0;
- for(var i=0;i<arrya.length
- 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
- 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\" > "+ "<ahref='javascript:Android.callQQ(\""+child[n]+"\")'>" +child[n];
- }else if(i==2){
- cell1.innerHTML= "<img src=\"file:///android_asset/wxicon.png\" height=\"12\" width=\"16\" > "+ "<ahref='javascript:Android.callWeixin(\""+child[n]+"\")'>" +child[n];
- }
- var cell2 = row.insertCell();
- }
- }
- }
- </script>
- </head>
- <body>
- <fontcolor="#0099FF"size="5"> 服務支援</font></p>
- <tableid="table">
- </table>
- </p></p></p></p></p>
- <fontcolor="#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需要呼叫的方法
[java] view plain copy print?- 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微信升級更改了類名
- */
- publicclass 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
- publicvoid callPhone(final String telphone) {
- Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
- + telphone));
- c.startActivity(intent);
- }
- @JavascriptInterface
- publicvoid 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
- publicvoid 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
- publicvoid getSource(String htmlstr) {
- // Log.e("html", htmlstr);
- // String path = c.getFilesDir().getAbsolutePath() + "/serve.html"; //
- // data/data目錄
- }
- //檢測包名的應用是否已經安裝在手機
- publicboolean checkBrowser(String packageName) {
- if (packageName == null || "".equals(packageName))
- returnfalse;
- try {
- ApplicationInfo info = c.getPackageManager().getApplicationInfo(
- packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
- returntrue;
- } catch (NameNotFoundException e) {
- returnfalse;
- }
- }
- }
myWebView.addJavascriptInterface(new AndroidJavaScript(this), "Android");
你是否發現html的js方法裡面有醬紫的語句
<a href='JavaScript:Android.callWeixin(\""+child[n]+"\")'>"
確實這裡面的”Android和“myWebView.addJavascriptInterface(new AndroidJavaScript(this), "Android");必須相同哦..
這裡注意雙引號哈
[java] view plain copy print?- 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加應該是不行的需要醬紫
[java] view plain copy print?- myWebView.setWebViewClient(webviewcilnt);
- ebViewClient webviewcilnt = new WebViewClient() {
- @Override
- publicvoid onReceivedError(WebView view, int errorCode,
- String description, String failingUrl) {
- }
- @Override
- publicvoid 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
- publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- }
- };
等待webview初始化html完成之後在呼叫js呵呵就這樣
轉自 http://blog.csdn.net/yung7086/article/details/34824167/
更新:在android 4.4.2以上,應該使用evaluateJavascript呼叫js程式碼,在回撥函式中處理返回函式結果。
webView.evaluateJavascript(script, new ValueCallback<String>() { @Override public void onReceiveValue(String s) { LOGGER.info("onReceiveValue: " + s); } });