android与html5的交互——数据库操作,UI操作,以及html5的localStorage、定位功能

文章转载: http://blog.csdn.net/cai1213/article/details/7956051


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

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

先看效果图:



布局文件:main.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns: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.     <Button android:id="@+id/button" android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content" android:text="Send To JavaScript" />  
  9.     <TextView android:id="@+id/textview" android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content" android:text="android itme"/>  
  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. <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd ">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5.   
  6. <script language="javascript" type="text/javascript">  
  7.   
  8. //初始化数据库  
  9. function initDatabase() {  
  10.     try {  
  11.         if (!window.openDatabase) {  
  12.             alert('Databases are not supported by your browser');  
  13.         } else {  
  14.             var shortName = 'YARINDB';  
  15.             var version = '1.0';  
  16.             var displayName = 'yarin db';  
  17.             var maxSize = 100000; // in bytes  
  18.             YARINDB = openDatabase(shortName, version, displayName, maxSize);  
  19.             createTables();  
  20.             selectAll();  
  21.         }  
  22.     } catch(e) {  
  23.         if (e == 2) {  
  24.             // Version mismatch.  
  25.             console.log("Invalid database version.");  //调试用,在控制台输出字符串  
  26.         } else {  
  27.             console.log("Unknown error "+ e +".");  
  28.         }  
  29.         return;  
  30.     }   
  31. }  
  32.   
  33. function createTables(){  
  34.     YARINDB.transaction(  
  35.         function (transaction) {  
  36.             transaction.executeSql('CREATE TABLE IF NOT EXISTS yarin(id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL,desc TEXT NOT NULL);', [], nullDataHandler, errorHandler);  
  37.         }  
  38.     );  
  39.     insertData();  
  40. }  
  41.   
  42. function insertData(){  
  43.     YARINDB.transaction(  
  44.         function (transaction) {  
  45.             //Starter data when page is initialized  
  46.             var data = ['1','yarin yang','I am yarin'];    
  47.             var data1 = ['2','Jason Choi','I am a graduate student!'];  
  48.             transaction.executeSql("INSERT INTO yarin(id, name, desc) VALUES (?, ?, ?)", [data[0], data[1], data[2]]);  
  49.             transaction.executeSql("INSERT INTO yarin(id, name, desc) VALUES (?, ?, ?)", [data1[0], data1[1], data1[2]]);  
  50.         }  
  51.     );    
  52. }  
  53.   
  54. function errorHandler(transaction, error){  
  55.     if (error.code==1){  
  56.         // DB Table already exists  
  57.     } else {  
  58.         // Error is a human-readable string.  
  59.         console.log('Oops.  Error was '+error.message+' (Code '+error.code+')');  
  60.     }  
  61.     return false;  
  62. }  
  63.   
  64.   
  65. function nullDataHandler(){  
  66.     console.log("SQL Query Succeeded");  
  67. }  
  68.   
  69. function selectAll(){   
  70.     YARINDB.transaction(  
  71.         function (transaction) {  
  72.             transaction.executeSql("SELECT * FROM yarin;", [], dataSelectHandler, errorHandler);  
  73.         }  
  74.     );    
  75. }  
  76.   
  77. function dataSelectHandler(transaction, results){  
  78.     // Handle the results  
  79.     for (var i=0; i<results.rows.length; i++) {  
  80.         var row = results.rows.item(i);  
  81.         var newFeature = new Object();  
  82.         newFeature.name   = row['name'];  
  83.         newFeature.decs = row['desc'];  
  84.           
  85.         document.getElementById("name").innerHTML="name:"+newFeature.name;  
  86.         document.getElementById("desc").innerHTML="desc:"+newFeature.decs;  
  87.     }  
  88. }  
  89.   
  90. function updateData(){  
  91.     YARINDB.transaction(  
  92.         function (transaction) {  
  93.             var data = ['xiaoming huang','not at all'];   
  94.             transaction.executeSql("UPDATE yarin SET name=?, desc=? WHERE id = 2", [data[0], data[1]]);  
  95.         }  
  96.     );    
  97.     selectAll();  
  98. }  
  99.   
  100. function ddeleteTables(){  
  101.     YARINDB.transaction(  
  102.         function (transaction) {  
  103.             transaction.executeSql("DROP TABLE yarin;", [], nullDataHandler, errorHandler);  
  104.         }  
  105.     );  
  106.     console.log("Table 'page_settings' has been dropped.");  
  107. }  
  108.   
  109.   
  110. //定位  
  111. function get_location() {  
  112.     if (navigator.geolocation) {  
  113.         navigator.geolocation.getCurrentPosition(show_map,handle_error,{enableHighAccuracy:false,maximumAge:1000,timeout:15000});  
  114.     } else {  
  115.         alert("Your browser does not support HTML5 geoLocation");  
  116.     }  
  117. }  
  118.       
  119. function show_map(position) {  
  120.     var latitude = position.coords.latitude;  
  121.     var longitude = position.coords.longitude;  
  122.     var city = position.coords.city;  
  123.     //telnet localhost 5554  
  124.     //geo fix -82.411629 28.054553  
  125.     //geo fix -121.45356 46.51119 4392  
  126.     //geo nmea $GPGGA,001431.092,0118.2653,N,10351.1359,E,0,00,,-19.6,M,4.1,M,,0000*5B  
  127.     document.getElementById("Latitude").innerHTML="latitude:"+latitude;  
  128.     document.getElementById("Longitude").innerHTML="longitude:"+longitude;  
  129.     document.getElementById("City").innerHTML="city:"+city;  
  130. }  
  131.       
  132. function handle_error(err) {  
  133.     switch (err.code) {  
  134.     case 1:  
  135.         alert("permission denied");  
  136.         break;  
  137.     case 2:  
  138.         alert("the network is down or the position satellites can't be contacted");  
  139.         break;  
  140.     case 3:  
  141.         alert("time out");  
  142.         break;  
  143.     default:  
  144.         alert("unknown error");  
  145.         break;  
  146.     }  
  147. }  
  148.   
  149. function initLocalStorage(){  
  150.     if (window.localStorage) {  
  151.         textarea.addEventListener("keyup", function() {  
  152.             window.localStorage["value"] = this.value;  
  153.             window.localStorage["time"] = new Date().getTime();  
  154.         }, false);  
  155.     } else {  
  156.         alert("LocalStorage are not supported in this browser.");  
  157.     }  
  158. }  
  159.   
  160. window.onload = function() {  
  161.     initDatabase();  
  162.     initLocalStorage();  
  163.     get_location();  
  164. }  
  165. </script>  
  166.   
  167. <script language="javascript" type="text/javascript">  
  168.     function getFromAndroid(str){    //接收来自android的数据  
  169.         document.getElementById("android").innerHTML=str;  
  170.     }  
  171.     function sendToAndroid(){  
  172.         console.log("!!!!!!!!!I'm sending to android!!!!!!!!!");  
  173.         var str = "the data is from JavaScript!";  
  174.         window.injs.runOnAndroidJavaScript(str);//通过injs接口调用android的函数  
  175.     }  
  176.     function ale()  
  177.     {  
  178.         alert("This is an alert!");  
  179.     }  
  180. </script>  
  181. </head>  
  182. <body>  
  183.     <div><input type="submit" name="Submit" value="alert" onclick="ale()" /></div>  
  184.       
  185.     <input type="button" value="Send To Android"  onclick="sendToAndroid()"/>  
  186.     <div id="android">JavaScript itme</div>  
  187.   
  188.     <textarea id="textarea"></textarea>  
  189.     <input type='button' value='get' onClick="alert(window.localStorage['value']+':'+window.localStorage['time'])"/>  
  190.       
  191.     <div id="name"></div>  
  192.     <div id="desc"></div>  
  193.     <input type="button" value="updateData"  onclick="updateData()"/>  
  194.       
  195.     <div id="Latitude"></div>  
  196.     <div id="Longitude"></div>  
  197.     <div id="City"></div>  
  198. </body>  
  199. </html>  


android类:MainActivity.class

[java]  view plain  copy
  1. package com.yarin.android.html5;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.app.AlertDialog.Builder;  
  6. import android.content.Context;  
  7. import android.content.DialogInterface;  
  8. import android.graphics.Bitmap;  
  9. import android.os.Bundle;  
  10. import android.os.Handler;  
  11. import android.view.KeyEvent;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.view.Window;  
  15. import android.webkit.GeolocationPermissions;  
  16. import android.webkit.JsResult;  
  17. import android.webkit.WebChromeClient;  
  18. import android.webkit.WebSettings;  
  19. import android.webkit.WebStorage;  
  20. import android.webkit.WebView;  
  21. import android.webkit.WebViewClient;  
  22. import android.widget.Button;  
  23. import android.widget.TextView;  
  24. //关于android2.3中javascript交互的问题  
  25. //http://code.google.com/p/android/issues/detail?id=12987  
  26. public class MainActivity extends Activity {  
  27.     private WebView webView = null;  
  28.     private Handler handler = new Handler();  
  29.     private Button button = null;  
  30.       
  31.     final class InJavaScript {  
  32.         public void runOnAndroidJavaScript(final String str) {  
  33.             handler.post(new Runnable() {  
  34.                 public void run() {   
  35.                     TextView show = (TextView) findViewById(R.id.textview);  
  36.                     show.setText(str);  
  37.                 }  
  38.             });  
  39.         }  
  40.     }  
  41.       
  42.     public void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.main);  
  45.           
  46.         button = (Button) findViewById(R.id.button);  
  47.         button.setOnClickListener(new OnClickListener() {  
  48.             public void onClick(View arg0) {  
  49.                 //调用javascript中的方法,传入string数据  
  50.                 webView.loadUrl("javascript:getFromAndroid('the data is from android!')");  
  51.             }  
  52.         });  
  53.           
  54.           
  55.         webView = (WebView) findViewById(R.id.webview);  
  56.           
  57.         //把本类的一个实例添加到js的全局对象window中,  
  58.         //这样就可以使用window.injs来调用它的方法  
  59.         webView.addJavascriptInterface(new InJavaScript(), "injs");  
  60.           
  61.         //设置支持JavaScript脚本  
  62.         WebSettings webSettings = webView.getSettings();    
  63.         webSettings.setJavaScriptEnabled(true);  
  64.         //设置可以访问文件  
  65.         webSettings.setAllowFileAccess(true);  
  66.         //设置支持缩放  
  67.         webSettings.setBuiltInZoomControls(true);  
  68.           
  69.         webSettings.setDatabaseEnabled(true);    
  70.         String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();  
  71.         webSettings.setDatabasePath(dir);  
  72.           
  73.         //使用localStorage则必须打开  
  74.         webSettings.setDomStorageEnabled(true);  
  75.           
  76.         webSettings.setGeolocationEnabled(true);  
  77.         //webSettings.setGeolocationDatabasePath(dir);  
  78.           
  79.           
  80.         //设置WebViewClient  
  81.         webView.setWebViewClient(new WebViewClient(){     
  82.             public boolean shouldOverrideUrlLoading(WebView view, String url) {     
  83.                 view.loadUrl(url);     
  84.                 return true;     
  85.             }    
  86.             public void onPageFinished(WebView view, String url) {  
  87.                 super.onPageFinished(view, url);  
  88.             }  
  89.             public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  90.                 super.onPageStarted(view, url, favicon);  
  91.             }  
  92.         });  
  93.           
  94.           
  95.         //设置WebChromeClient  
  96.         webView.setWebChromeClient(new WebChromeClient(){  
  97.             //处理javascript中的alert  
  98.             public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {  
  99.                 //构建一个Builder来显示网页中的对话框  
  100.                 Builder builder = new Builder(MainActivity.this);  
  101.                 builder.setTitle("Alert");  
  102.                 builder.setMessage(message);  
  103.                 builder.setPositiveButton(android.R.string.ok,  
  104.                         new AlertDialog.OnClickListener() {  
  105.                             public void onClick(DialogInterface dialog, int which) {  
  106.                                 result.confirm();  
  107.                             }  
  108.                         });  
  109.                 builder.setCancelable(false);  
  110.                 builder.create();  
  111.                 builder.show();  
  112.                 return true;  
  113.             };  
  114.             //处理javascript中的confirm  
  115.             public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {  
  116.                 Builder builder = new Builder(MainActivity.this);  
  117.                 builder.setTitle("confirm");  
  118.                 builder.setMessage(message);  
  119.                 builder.setPositiveButton(android.R.string.ok,  
  120.                         new AlertDialog.OnClickListener() {  
  121.                             public void onClick(DialogInterface dialog, int which) {  
  122.                                 result.confirm();  
  123.                             }  
  124.                         });  
  125.                 builder.setNegativeButton(android.R.string.cancel,  
  126.                         new DialogInterface.OnClickListener() {  
  127.                             public void onClick(DialogInterface dialog, int which) {  
  128.                                 result.cancel();  
  129.                             }  
  130.                         });  
  131.                 builder.setCancelable(false);  
  132.                 builder.create();  
  133.                 builder.show();  
  134.                 return true;  
  135.             };  
  136.               
  137.             @Override  
  138.             //设置网页加载的进度条  
  139.             public void onProgressChanged(WebView view, int newProgress) {  
  140.                 MainActivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress * 100);  
  141.                 super.onProgressChanged(view, newProgress);  
  142.             }  
  143.   
  144.             //设置应用程序的标题title  
  145.             public void onReceivedTitle(WebView view, String title) {  
  146.                 MainActivity.this.setTitle(title);  
  147.                 super.onReceivedTitle(view, title);  
  148.             }  
  149.   
  150.             public void onExceededDatabaseQuota(String url,  
  151.                     String databaseIdentifier, long currentQuota,  
  152.                     long estimatedSize, long totalUsedQuota,  
  153.                     WebStorage.QuotaUpdater quotaUpdater) {  
  154.                 quotaUpdater.updateQuota(estimatedSize * 2);  
  155.             }  
  156.               
  157.             public void onGeolocationPermissionsShowPrompt(String origin,  
  158.                     GeolocationPermissions.Callback callback) {  
  159.                 callback.invoke(origin, truefalse);  
  160.                 super.onGeolocationPermissionsShowPrompt(origin, callback);  
  161.             }  
  162.               
  163.             public void onReachedMaxAppCacheSize(long spaceNeeded,  
  164.                     long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {  
  165.                 quotaUpdater.updateQuota(spaceNeeded * 2);  
  166.             }  
  167.         });  
  168.         // 覆盖默认后退按钮的作用,替换成WebView里的查看历史页面    
  169.         webView.setOnKeyListener(new View.OnKeyListener() {  
  170.             public boolean onKey(View v, int keyCode, KeyEvent event) {  
  171.                 if (event.getAction() == KeyEvent.ACTION_DOWN) {  
  172.                     if ((keyCode == KeyEvent.KEYCODE_BACK)  
  173.                             && webView.canGoBack()) {  
  174.                         webView.goBack();  
  175.                         return true;  
  176.                     }  
  177.                 }  
  178.                 return false;  
  179.             }  
  180.         });  
  181.         webView.loadUrl("file:///android_asset/index.html");  
  182.     }   
  183. }  

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值