Android与html5之间可以相互交互,即android中的类可以调用JavaScript中的函数,javascript可以调用android中的类的方法。

这个例子中,html5完成数据库的操作,包括数据库的创建、表的创建、数据的增删查改等,还有html5的定位功能。

先看效果图:

Android与Html5交互_第1张图片


布局文件:main.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Buttonandroid:id="@+id/button"android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"android:text="SendToJavaScript"/>
  9. <TextViewandroid:id="@+id/textview"android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"android:text="androiditme"/>
  11. <WebView
  12. android:id="@+id/webview"
  13. android:layout_width="fill_parent"
  14. android:layout_height="fill_parent"
  15. android:layout_weight="1"/>
  16. </LinearLayout>

html5文件:index.html

[html] view plain copy
  1. <!DOCTYPEhtmlPUBLIC"-//WAPFORUM//DTDXHTMLMobile1.0//EN""http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
  2. <htmlxmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
  5. <scriptlanguage="javascript"type="text/javascript">
  6. //初始化数据库
  7. functioninitDatabase(){
  8. try{
  9. if(!window.openDatabase){
  10. alert('Databasesarenotsupportedbyyourbrowser');
  11. }else{
  12. varshortName='YARINDB';
  13. varversion='1.0';
  14. vardisplayName='yarindb';
  15. varmaxSize=100000;//inbytes
  16. YARINDB=openDatabase(shortName,version,displayName,maxSize);
  17. createTables();
  18. selectAll();
  19. }
  20. }catch(e){
  21. if(e==2){
  22. //Versionmismatch.
  23. console.log("Invaliddatabaseversion.");//调试用,在控制台输出字符串
  24. }else{
  25. console.log("Unknownerror"+e+".");
  26. }
  27. return;
  28. }
  29. }
  30. functioncreateTables(){
  31. YARINDB.transaction(
  32. function(transaction){
  33. transaction.executeSql('CREATETABLEIFNOTEXISTSyarin(idINTEGERNOTNULLPRIMARYKEY,nameTEXTNOTNULL,descTEXTNOTNULL);',[],nullDataHandler,errorHandler);
  34. }
  35. );
  36. insertData();
  37. }
  38. functioninsertData(){
  39. YARINDB.transaction(
  40. function(transaction){
  41. //Starterdatawhenpageisinitialized
  42. vardata=['1','yarinyang','Iamyarin'];
  43. vardata1=['2','JasonChoi','Iamagraduatestudent!'];
  44. transaction.executeSql("INSERTINTOyarin(id,name,desc)VALUES(?,?,?)",[data[0],data[1],data[2]]);
  45. transaction.executeSql("INSERTINTOyarin(id,name,desc)VALUES(?,?,?)",[data1[0],data1[1],data1[2]]);
  46. }
  47. );
  48. }
  49. functionerrorHandler(transaction,error){
  50. if(error.code==1){
  51. //DBTablealreadyexists
  52. }else{
  53. //Errorisahuman-readablestring.
  54. console.log('Oops.Errorwas'+error.message+'(Code'+error.code+')');
  55. }
  56. returnfalse;
  57. }
  58. functionnullDataHandler(){
  59. console.log("SQLQuerySucceeded");
  60. }
  61. functionselectAll(){
  62. YARINDB.transaction(
  63. function(transaction){
  64. transaction.executeSql("SELECT*FROMyarin;",[],dataSelectHandler,errorHandler);
  65. }
  66. );
  67. }
  68. functiondataSelectHandler(transaction,results){
  69. //Handletheresults
  70. for(vari=0;i<results.rows.length;i++){
  71. varrow=results.rows.item(i);
  72. varnewFeature=newObject();
  73. newFeature.name=row['name'];
  74. newFeature.decs=row['desc'];
  75. document.getElementById("name").innerHTML="name:"+newFeature.name;
  76. document.getElementById("desc").innerHTML="desc:"+newFeature.decs;
  77. }
  78. }
  79. functionupdateData(){
  80. YARINDB.transaction(
  81. function(transaction){
  82. vardata=['xiaominghuang','notatall'];
  83. transaction.executeSql("UPDATEyarinSETname=?,desc=?WHEREid=2",[data[0],data[1]]);
  84. }
  85. );
  86. selectAll();
  87. }
  88. functionddeleteTables(){
  89. YARINDB.transaction(
  90. function(transaction){
  91. transaction.executeSql("DROPTABLEyarin;",[],nullDataHandler,errorHandler);
  92. }
  93. );
  94. console.log("Table'page_settings'hasbeendropped.");
  95. }
  96. //定位
  97. functionget_location(){
  98. if(navigator.geolocation){
  99. navigator.geolocation.getCurrentPosition(show_map,handle_error,{enableHighAccuracy:false,maximumAge:1000,timeout:15000});
  100. }else{
  101. alert("YourbrowserdoesnotsupportHTML5geoLocation");
  102. }
  103. }
  104. functionshow_map(position){
  105. varlatitude=position.coords.latitude;
  106. varlongitude=position.coords.longitude;
  107. varcity=position.coords.city;
  108. //telnetlocalhost5554
  109. //geofix-82.41162928.054553
  110. //geofix-121.4535646.511194392
  111. //geonmea$GPGGA,001431.092,0118.2653,N,10351.1359,E,0,00,,-19.6,M,4.1,M,,0000*5B
  112. document.getElementById("Latitude").innerHTML="latitude:"+latitude;
  113. document.getElementById("Longitude").innerHTML="longitude:"+longitude;
  114. document.getElementById("City").innerHTML="city:"+city;
  115. }
  116. functionhandle_error(err){
  117. switch(err.code){
  118. case1:
  119. alert("permissiondenied");
  120. break;
  121. case2:
  122. alert("thenetworkisdownorthepositionsatellitescan'tbecontacted");
  123. break;
  124. case3:
  125. alert("timeout");
  126. break;
  127. default:
  128. alert("unknownerror");
  129. break;
  130. }
  131. }
  132. functioninitLocalStorage(){
  133. if(window.localStorage){
  134. textarea.addEventListener("keyup",function(){
  135. window.localStorage["value"]=this.value;
  136. window.localStorage["time"]=newDate().getTime();
  137. },false);
  138. }else{
  139. alert("LocalStoragearenotsupportedinthisbrowser.");
  140. }
  141. }
  142. window.onload=function(){
  143. initDatabase();
  144. initLocalStorage();
  145. get_location();
  146. }
  147. </script>
  148. <scriptlanguage="javascript"type="text/javascript">
  149. functiongetFromAndroid(str){//接收来自android的数据
  150. document.getElementById("android").innerHTML=str;
  151. }
  152. functionsendToAndroid(){
  153. console.log("!!!!!!!!!I'msendingtoandroid!!!!!!!!!");
  154. varstr="thedataisfromJavaScript!";
  155. window.injs.runOnAndroidJavaScript(str);//通过injs接口调用android的函数
  156. }
  157. functionale()
  158. {
  159. alert("Thisisanalert!");
  160. }
  161. </script>
  162. </head>
  163. <body>
  164. <div><inputtype="submit"name="Submit"value="alert"onclick="ale()"/></div>
  165. <inputtype="button"value="SendToAndroid"onclick="sendToAndroid()"/>
  166. <divid="android">JavaScriptitme</div>
  167. <textareaid="textarea"></textarea>
  168. <inputtype='button'value='get'onClick="alert(window.localStorage['value']+':'+window.localStorage['time'])"/>
  169. <divid="name"></div>
  170. <divid="desc"></div>
  171. <inputtype="button"value="updateData"onclick="updateData()"/>
  172. <divid="Latitude"></div>
  173. <divid="Longitude"></div>
  174. <divid="City"></div>
  175. </body>
  176. </html>


android类:MainActivity.class

[java] view plain copy
  1. packagecom.yarin.android.html5;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.app.AlertDialog.Builder;
  5. importandroid.content.Context;
  6. importandroid.content.DialogInterface;
  7. importandroid.graphics.Bitmap;
  8. importandroid.os.Bundle;
  9. importandroid.os.Handler;
  10. importandroid.view.KeyEvent;
  11. importandroid.view.View;
  12. importandroid.view.View.OnClickListener;
  13. importandroid.view.Window;
  14. importandroid.webkit.GeolocationPermissions;
  15. importandroid.webkit.JsResult;
  16. importandroid.webkit.WebChromeClient;
  17. importandroid.webkit.WebSettings;
  18. importandroid.webkit.WebStorage;
  19. importandroid.webkit.WebView;
  20. importandroid.webkit.WebViewClient;
  21. importandroid.widget.Button;
  22. importandroid.widget.TextView;
  23. //关于android2.3中javascript交互的问题
  24. //http://code.google.com/p/android/issues/detail?id=12987
  25. publicclassMainActivityextendsActivity{
  26. privateWebViewwebView=null;
  27. privateHandlerhandler=newHandler();
  28. privateButtonbutton=null;
  29. finalclassInJavaScript{
  30. publicvoidrunOnAndroidJavaScript(finalStringstr){
  31. handler.post(newRunnable(){
  32. publicvoidrun(){
  33. TextViewshow=(TextView)findViewById(R.id.textview);
  34. show.setText(str);
  35. }
  36. });
  37. }
  38. }
  39. publicvoidonCreate(BundlesavedInstanceState){
  40. super.onCreate(savedInstanceState);
  41. setContentView(R.layout.main);
  42. button=(Button)findViewById(R.id.button);
  43. button.setOnClickListener(newOnClickListener(){
  44. publicvoidonClick(Viewarg0){
  45. //调用javascript中的方法,传入string数据
  46. webView.loadUrl("javascript:getFromAndroid('thedataisfromandroid!')");
  47. }
  48. });
  49. webView=(WebView)findViewById(R.id.webview);
  50. //把本类的一个实例添加到js的全局对象window中,
  51. //这样就可以使用window.injs来调用它的方法
  52. webView.addJavascriptInterface(newInJavaScript(),"injs");
  53. //设置支持JavaScript脚本
  54. WebSettingswebSettings=webView.getSettings();
  55. webSettings.setJavaScriptEnabled(true);
  56. //设置可以访问文件
  57. webSettings.setAllowFileAccess(true);
  58. //设置支持缩放
  59. webSettings.setBuiltInZoomControls(true);
  60. webSettings.setDatabaseEnabled(true);
  61. Stringdir=this.getApplicationContext().getDir("database",Context.MODE_PRIVATE).getPath();
  62. webSettings.setDatabasePath(dir);
  63. //使用localStorage则必须打开
  64. webSettings.setDomStorageEnabled(true);
  65. webSettings.setGeolocationEnabled(true);
  66. //webSettings.setGeolocationDatabasePath(dir);
  67. //设置WebViewClient
  68. webView.setWebViewClient(newWebViewClient(){
  69. publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
  70. view.loadUrl(url);
  71. returntrue;
  72. }
  73. publicvoidonPageFinished(WebViewview,Stringurl){
  74. super.onPageFinished(view,url);
  75. }
  76. publicvoidonPageStarted(WebViewview,Stringurl,Bitmapfavicon){
  77. super.onPageStarted(view,url,favicon);
  78. }
  79. });
  80. //设置WebChromeClient
  81. webView.setWebChromeClient(newWebChromeClient(){
  82. //处理javascript中的alert
  83. publicbooleanonJsAlert(WebViewview,Stringurl,Stringmessage,finalJsResultresult){
  84. //构建一个Builder来显示网页中的对话框
  85. Builderbuilder=newBuilder(MainActivity.this);
  86. builder.setTitle("Alert");
  87. builder.setMessage(message);
  88. builder.setPositiveButton(android.R.string.ok,
  89. newAlertDialog.OnClickListener(){
  90. publicvoidonClick(DialogInterfacedialog,intwhich){
  91. result.confirm();
  92. }
  93. });
  94. builder.setCancelable(false);
  95. builder.create();
  96. builder.show();
  97. returntrue;
  98. };
  99. //处理javascript中的confirm
  100. publicbooleanonJsConfirm(WebViewview,Stringurl,Stringmessage,finalJsResultresult){
  101. Builderbuilder=newBuilder(MainActivity.this);
  102. builder.setTitle("confirm");
  103. builder.setMessage(message);
  104. builder.setPositiveButton(android.R.string.ok,
  105. newAlertDialog.OnClickListener(){
  106. publicvoidonClick(DialogInterfacedialog,intwhich){
  107. result.confirm();
  108. }
  109. });
  110. builder.setNegativeButton(android.R.string.cancel,
  111. newDialogInterface.OnClickListener(){
  112. publicvoidonClick(DialogInterfacedialog,intwhich){
  113. result.cancel();
  114. }
  115. });
  116. builder.setCancelable(false);
  117. builder.create();
  118. builder.show();
  119. returntrue;
  120. };
  121. @Override
  122. //设置网页加载的进度条
  123. publicvoidonProgressChanged(WebViewview,intnewProgress){
  124. MainActivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS,newProgress*100);
  125. super.onProgressChanged(view,newProgress);
  126. }
  127. //设置应用程序的标题title
  128. publicvoidonReceivedTitle(WebViewview,Stringtitle){
  129. MainActivity.this.setTitle(title);
  130. super.onReceivedTitle(view,title);
  131. }
  132. publicvoidonExceededDatabaseQuota(Stringurl,
  133. StringdatabaseIdentifier,longcurrentQuota,
  134. longestimatedSize,longtotalUsedQuota,
  135. WebStorage.QuotaUpdaterquotaUpdater){
  136. quotaUpdater.updateQuota(estimatedSize*2);
  137. }
  138. publicvoidonGeolocationPermissionsShowPrompt(Stringorigin,
  139. GeolocationPermissions.Callbackcallback){
  140. callback.invoke(origin,true,false);
  141. super.onGeolocationPermissionsShowPrompt(origin,callback);
  142. }
  143. publicvoidonReachedMaxAppCacheSize(longspaceNeeded,
  144. longtotalUsedQuota,WebStorage.QuotaUpdaterquotaUpdater){
  145. quotaUpdater.updateQuota(spaceNeeded*2);
  146. }
  147. });
  148. //覆盖默认后退按钮的作用,替换成WebView里的查看历史页面
  149. webView.setOnKeyListener(newView.OnKeyListener(){
  150. publicbooleanonKey(Viewv,intkeyCode,KeyEventevent){
  151. if(event.getAction()==KeyEvent.ACTION_DOWN){
  152. if((keyCode==KeyEvent.KEYCODE_BACK)
  153. &&webView.canGoBack()){
  154. webView.goBack();
  155. returntrue;
  156. }
  157. }
  158. returnfalse;
  159. }
  160. });
  161. webView.loadUrl("file:///android_asset/index.html");
  162. }
  163. }

更多相关文章

  1. android新建项目时gen目录下的R文件没有自动的生成
  2. Java大文件上传(Android亦可)
  3. Android 中Popwindow弹出菜单的两种方法实例
  4. 关于Android连接远程数据库(mysql、oracle)
  5. Android中线程的使用方法
  6. 【Android Developers Training】 40. 序言:通过NFC共享文件
  7. android设备adb usb驱动安装方法

随机推荐

  1. Eclipse搭建Android开发环境
  2. ProgressBar简介
  3. listview 左滑弹出删除按钮,需要折腾一下
  4. Unity-Android通信:AndroidJava 使用Unity
  5. Ubuntu下安装Android(安卓)SDK
  6. Android(安卓)S5PV210 fimc驱动分析 - fi
  7. Android(安卓)传感器用法
  8. 获取Android的APK包签名信息
  9. Android(安卓)Studio 关联项目软链接
  10. Android(安卓)Studio 获取数字签名信息(SH