2013年6月28日 星期五

[android]特別企劃~垃圾車在哪裡,絕對難不倒你

某個月黑風高的夜裡
筆者因為錯過了家門口的垃圾車
拿著手機連上環保局,看著沒有支援手機板的網站
痛苦的查著只有地址的垃圾車班表
不熟悉的路名還要貼到google map去找
提著一包垃圾騎著歐兜賣
在不斷的等待與錯過中就這樣在路上折騰了好久
最後才將垃圾交給一台偶遇的垃圾車結束這一天的冒險

有鑑於此
我發願要把這一切簡單化
筆者跟java不熟,也從來沒寫過任何app
但我相信google威能,於是就開始訂定了我需要的api和資料

更新,1跟2的資料
以高雄市來說,現在可以直接下載到垃圾車的座標資訊
https://waste.ksepb.gov.tw/
使用上方便太多了
/*
1. 垃圾車地點、時間資料
萬事起頭難,我決定第一步先不碰java
先用自己熟悉的C#來準備好需要的資料
雖然是用熟悉的技術
但這個是讓我搞了最久的部分
http://abandoned.kbj.com.tw/waste/search <--垃圾車資料網站
自己摸著摸著挖出了用QueryString來列所有資料的方式
http://abandoned.kbj.com.tw/waste/search/0/0/0/0/0 這是我最後找到的
最後一個參數是決定開始顯示的index
而每次固定顯示15筆,於是只能for loop了
這個處理資料的過程就不贅述了
基本上就是用HttpWebRequest抓畫面中的表格分析資料塞進sqlite
而各地環保局的網站各自成一格
若要將這功能發揚光大至全台灣恐怕花最多時間的都是在蒐集資料這工作了

2. 補足定位點資料
現在有了地址我打算連同座標也整理好才放進app
app做的事情只有讀出座標判斷距離顯示在地圖上
這邊使用的是google map的api
var url = String.Format("http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address={0}", address);
address帶的當然就是地址了
當中xml是我選比較習慣的格式,也可以用json的格式取得回傳結果
另外sensor這個參數一定要帶,不然查不出來
取出的xml分析的動作用XmlDocument就可以搞定了
格式及用法可參考 https://developers.google.com/maps/documentation/geocoding/?hl=zh-tw
另外google map這個api有每天2500次Query的限制
每秒內的Query次數也有限制
因此我為了補足這些資料洗了好幾次ip
*/


3. 資料內嵌進app
準備好的資料要送進app內
這邊我參考的是這篇
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
作法完全照抄網頁上的方式

4. Google Maps Android API
基本上這個app要達到的目的就是在地圖上顯示自己的座標和附近的垃圾車座標
而我相信google map會是一個好選擇
設定及使用方式參考了這個
http://cheng-min-i-taiwan.blogspot.tw/2013/04/google-maps-android-api-v2-android.html
溫馨小提醒
在Google API Console要打開的是Google Maps Android API v2不是Google Maps API喔
筆者由於眼殘在這邊卡了一下

5. 取得定位點
GPS定位這個只是個小技巧
網路上的資源多如牛毛
但大部分都是做個Class來implements LocationListener
我是懶人所以我則是參考了這篇
http://zhuyonghui116.blog.hexun.com.tw/43948361_d.html
另外發現在requestLocationUpdates後他就隨著周期卯起來一直定了
然而我只有在開啟app和按下更新時想去跑一次
所以還有參考了這篇
http://hp.dewen.org/?p=576

結合以上的東西,這個app大致上算完成了
剩下的就是換個美美的圖再把exception修一修
畢竟是個不熟悉的開發工具跟語言
整個過程其實也花了不少時間
但這也證明了一件事
你可以不會寫程式也可以不會用IDE
但你一定要會用google search