1. 程式人生 > >安卓webview和js+html互動利用的addJavascriptInterface和webview.loadUrl("javascript:**");

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

近期做一個專案需要把一個 服務支援的介面用webview來顯示..呀 html白雪了js更是一樣啥也不會,相信很多初學屌絲員跟我一樣,,

html開發工具都不知道怎麼寫..哈哈哈.....現在把做完的結果分享一下先上圖了

,,

這是從專案中特意分離出來的demo這裡之上一些關鍵程式碼

步驟 首先在assets目錄下建一個html檔案

[html] view plain copy print?
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3.   <head>
  4.         <metahttp-equiv="Content-Type"content="text/xhtml; charset=utf-8"/>
  5. <scripttype="text/javascript">
  6. function createTable(phon){   
  7.    var table = document.getElementById("table");   
  8.    var arrya=phon.split(";");  
  9.    var rowindex=0;  
  10.   for(var i=0;i<arrya.length
    ;i++){  
  11.          var  childarrya[i].split(",");  
  12.          var row = table.insertRow(rowindex);//建立一行   
  13.          rowindex+=1;  
  14.          var cell1 = row.insertCell();//建立一個單元   
  15.          cell1.innerHTML=child[0];  
  16.           var cell2 = row.insertCell();//建立一個單元   
  17.          cell2.innerHTML="("+i+")";  
  18.         for(var n
    =1;n<child.length;n++){  
  19.              var row = table.insertRow(rowindex);//建立一行   
  20.              rowindex+=1;  
  21.              var cell1 = row.insertCell();//建立一個單元   
  22.            if(i==0){  
  23.               cell1.innerHTML= "<a href='javascript:Android.callPhone(\""+child[n]+"\")'>" +child[n];   
  24.            }else if(i==1){  
  25.              cell1.innerHTML= "<img src=\"file:///android_asset/qqicon.png\" height=\"14\" width=\"16\" > "+ "<ahref='javascript:Android.callQQ(\""+child[n]+"\")'>" +child[n];   
  26.            }else if(i==2){  
  27.              cell1.innerHTML= "<img src=\"file:///android_asset/wxicon.png\" height=\"12\" width=\"16\" > "+ "<ahref='javascript:Android.callWeixin(\""+child[n]+"\")'>" +child[n];   
  28.            }  
  29.            var cell2 = row.insertCell();  
  30.          }  
  31.      }  
  32.  }   
  33. </script>
  34.  </head>
  35.  <body>
  36.  <fontcolor="#0099FF"size="5"> 服務支援</font></p>
  37. <tableid="table">
  38. </table>
  39. </p></p></p></p></p>
  40.  <fontcolor="#233fF1"size="2">
  41.  PS:</p>
  42. 以上連線可以點選進入QQ或者微信程式,介面的電話號碼QQ號碼都是從伺服器獲取,獲取的資料直接儲存在應用的私有目錄下,然後從該目錄取出資料通過java類呼叫js填充到html上,html根據繫結的java物件呼叫java類的方法實現撥打電話,, 轉載請標明出處  
  43. </p> 尊重作者 @author yung7086   
  44. </p> 2014年6月26日 11:25:46</font>
  45.  </body>
  46. </html>

玩這個都玩了好久應為直接是eclipse開發 寫一個function寫了N遍老師少了逗號大括號還不報錯。。。。鬱悶的求推薦html+js的開發工具

算了還是整片的貼出來吧..html需要呼叫撥打電話這些功能就需要呼叫Java類了這裡我就需要定義一個java類實現html需要呼叫的方法

[java] view plain copy print?
  1. package com.example.jsdemo;  
  2. import android.content.ComponentName;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.content.pm.ApplicationInfo;  
  6. import android.content.pm.PackageManager;  
  7. import android.content.pm.PackageManager.NameNotFoundException;  
  8. import android.net.Uri;  
  9. import android.webkit.JavascriptInterface;  
  10. /** 
  11.  * JS的呼叫的方法 
  12.  *  
  13.  * @author yung 
  14.  *         <p> 
  15.  *         2014年6月24日 09:26:14 
  16.  *         <p> 
  17.  *         此類中的開啟的QQ 和微信是直接通過包名和類名呼叫雖然QQ微信包名不容易變 但是主介面好事可能會變 
  18.  *         如果發現打不開QQ微信應用可以檢視是否是QQ微信升級更改了類名 
  19.  */
  20. publicclass AndroidJavaScript {  
  21.     Context c;  
  22.     String[] qqpackage = new String[] { "com.tencent.mobileqq",  
  23.             "com.tencent.mobileqq.activity.SplashActivity" };  
  24.     String[] wxpackage = new String[] { "com.tencent.mm",  
  25.             "com.tencent.mm.ui.LauncherUI" };  
  26.     public AndroidJavaScript(Context c) {  
  27.         this.c = c;  
  28.     }  
  29.     @JavascriptInterface
  30.     publicvoid callPhone(final String telphone) {  
  31.         Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
  32.                 + telphone));  
  33.         c.startActivity(intent);  
  34.     }  
  35.     @JavascriptInterface
  36.     publicvoid callQQ(String qq) {  
  37.         // 實現呼叫電話號碼
  38.         if (!checkBrowser(qqpackage[0])) {  
  39.         } else {  
  40.             Intent intent = new Intent();  
  41.             ComponentName cmp = new ComponentName(qqpackage[0], qqpackage[1]);  
  42.             intent.setAction(Intent.ACTION_MAIN);  
  43.             intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  44.             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  45.             intent.setComponent(cmp);  
  46.             c.startActivity(intent);  
  47.         }  
  48.     }  
  49.     @JavascriptInterface
  50.     publicvoid callWeixin(String weixin) {  
  51.         if (!checkBrowser(wxpackage[0])) {  
  52.         } else {  
  53.             Intent intent = new Intent();  
  54.             ComponentName cmp = new ComponentName(wxpackage[0], wxpackage[1]);  
  55.             intent.setAction(Intent.ACTION_MAIN);  
  56.             intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  57.             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  58.             intent.setComponent(cmp);  
  59.             c.startActivity(intent);  
  60.         }  
  61.     }  
  62.     // 獲取在webview上獲取js生成的html的原始碼
  63.     @JavascriptInterface
  64.     publicvoid getSource(String htmlstr) {  
  65.         // Log.e("html", htmlstr);
  66.         // String path = c.getFilesDir().getAbsolutePath() + "/serve.html"; //
  67.         // data/data目錄
  68.     }  
  69.         //檢測包名的應用是否已經安裝在手機
  70.     publicboolean checkBrowser(String packageName) {  
  71.         if (packageName == null || "".equals(packageName))  
  72.             returnfalse;  
  73.         try {  
  74.             ApplicationInfo info = c.getPackageManager().getApplicationInfo(  
  75.                     packageName, PackageManager.GET_UNINSTALLED_PACKAGES);  
  76.             returntrue;  
  77.         } catch (NameNotFoundException e) {  
  78.             returnfalse;  
  79.         }  
  80.     }  
  81. }  
現在有了方法有了html就差怎麼呼叫了這樣記得設定webview必要是引數

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?
  1. WebSettings webSettings = myWebView.getSettings();  
  2.         webSettings.setJavaScriptEnabled(true);  
  3.         isExistsHTML();  
  4.         // myWebView.loadUrl("file:///android_asset/ss.html");
  5.         String path = getFilesDir().getAbsolutePath() + HTMLNAME; // data/data目錄
  6.         myWebView.loadUrl("file:///" + path);  
  7.         myWebView.addJavascriptInterface(new AndroidJavaScript(this), "Android");  
  8.         // myWebView.loadUrl("javascript:getStr('" + 122222 + "')");
  9.         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?
  1. myWebView.setWebViewClient(webviewcilnt);  
  2. ebViewClient webviewcilnt = new WebViewClient() {  
  3.     @Override
  4.     publicvoid onReceivedError(WebView view, int errorCode,  
  5.             String description, String failingUrl) {  
  6.     }  
  7.     @Override
  8.     publicvoid onPageFinished(WebView view, String url) {  
  9.         super.onPageFinished(view, url);  
  10.         String phon = loadHTMLData();  
  11.         myWebView.loadUrl("javascript:createTable('" + phon + "')");  
  12.         // 獲取webview載入的html頁面
  13.         view.loadUrl("javascript:window.Android.getSource('<html>'+"
  14.                 + "document.getElementsByTagName('html')[0].innerHTML+'</html>');");  
  15.     }  
  16.     @Override
  17.     publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {  
  18.         super.onPageStarted(view, url, favicon);  
  19.     }  
  20. };  

等待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);
    }
});