2010年12月22日 星期三

[記事] Create an android app by appInventor


Google 大概是有看到全家的廣告,決定不只玩台灣可以拼一拼,連Android上的應用程式都可以像積本一樣拼一拼,本著不落人後的精神玩了兩天 (其實是想摸魚)弄了個玩具 GPS 記錄器,成果如下。

基本上對這個玩具沒什麼期待,只要能輸入帳號,按下記錄鈕後,讓我 中個大樂透... 每五秒記錄當下的座標,每五分鐘將整筆記錄送往後端伺服器儲存,其間位置與網路連線產生的訊息顯示在螢幕上就可以了。

進到 http://appinventor.googlelabs.com 建好專案後,先拉出 Layout  ,啊能拿來用的東西,請參考 http://appinventor.googlelabs.com/learn/reference/index.html。依照上面的情境,我用了Button、Label、Textbox、LocationSensor、Timer、TinyWebDB等幾個。


然後在元件區塊幫你的元件改名字,看是叫阿珠還是阿花都可以,總之要人性化一點比較有親切感,叫一號、二號、三號、四號、四號之二 一整個就是阿宅的風格 (我絕對沒在影射尾田老師,各位不用翻 608 號的海賊王來求証)

然後打開 Block Editor 開始堆積木 (啊要是 JVM 大姨媽來不想起床,可以參考 http://napmas.blogspot.com/2010/12/could-not-create-jvm-while-opening.html )。蔡神有交代,寫程式要先宣告變數,堆積本也不例外。噢,對了,在appInventor中,你能建立的資料型態只有 number 、text 、list,procedue 算嗎 ? 物件什麼鬼的 ? 想得美喔~~~

因為做的是GPS記錄器,最重要的當然是抓到 GPS 座標。基本上直接抓 LocationSensor的 latitude 跟 longitude就好了,但程式碼太短會被長官瞧不起,所以很ㄍㄟ熬的放在 LocationChangedEvent 觸發時處理 (其實這事關 android 的 location sensor 不保證你抓的就是當下的座標,但說來落落長,被當白痴比解釋要輕鬆多了,想研究的自己去 K  android.location.Manager.requestLocationUpdates)

然後設定記錄紐按下後要做的事,沒有什麼,就是沒在記錄就記錄,在記錄就停止記綠。至於記錄的事交給Timer定時去處理。


Timer! 也沒做什麼事,就 沒在記錄就記錄,在記錄就停止記綠... ,每五秒要是發現位置移動了,就記一筆到 list 裡,每五分鐘把 list 丟給遠端的Server。

丟東西這件事,就有點小撇步了,基本上AppInventor 裡沒有HttpRequest /URL 這些Java的東西,但有個包裝好的TinyWebDB 元件讓你可以以 key/value的方式存取"一組"遠端資料 ,伺服器的網址可以自定 ,然後以HTTP協定溝通,聽起來就像一般網頁的行為嘛 ?! 是,但要用也沒這麼簡單,因為它跟我一樣gay熬地幫你在發出的request url 後面加上 "/storeavalue" 或是 "/getvalue" 的字樣 (servlet ??) ,然後它又是封裝好的元件你動不了,直接用的結果就是拿到一個 HTTP 404 的錯誤,這樣的邏輯感覺上是當PHP/ASP/JSP的用戶都死光就對了 = = 這個小問題可以藉由在Web伺服務動點小手腳來解決,不囉嗦,看解法 :  (以 lighttpd 為例,其他的 web server 請自行改寫)

url.rewrite-once = (
    "^/YOUR_PATH/YOUR_PAGE/([a-zA-Z]+)" => "/YOUR_PATH/YOUR_PAGE?action=$1"
)
伺服器端設定好後,只要叫 TinyWebDB發射就可以了。送出(POST)的東西有兩個,一個叫 tag 另一個叫 value (硬要挑毛病的話,是的,還有一個你自已生的GET 參數叫 action) ,這邊又可以玩的一個花招是 TinyWebDB 把list丟出去前,會很識相的幫你轉成 JSON String,利用這個特性,你就可以把多筆/多個數值一次送出到伺服器端進行處理。同理,吃到的JSON string 也可以變成 list ? 沒試過,以後再說。另外 TinyWebDB 跟 WebView一樣,沒辦法透過 proxy 連線,要是有人跟我一樣苦命身在一個沒辦法連外網的網路公司,請自求多福。

最後,媽媽有交代,射後不理是不負責的行為,TinyWebDB 有幾個事件可以運用,看是要拿掉,還是要付錢,悉聽尊便 (大誤)


把這些東西兜一塊兒就變最上面那張的樣子,有勇氣的話透過網頁上的 package for phone 的選項就可以把這個鬼玩意兒下載到你的 Android phone裡 (手機裡要是有 barcode reader,三個選項中,Show barcode 應該是最方便的)。結束。拖拖拉拉就可以完成一個手機應用程式,從頭到尾不用寫一行Code。

感覺上,這樣的開發模式適合有程式觀念,但沒Android 開發經驗的人「體驗」或是寫一些計算 1+1=2 之類的小程式,再上去的話,整個過程中缺乏太多東西 (元件不足,又很難自訂函式)、Block Editor 在元件過多時電腦風扇就會開始嬌喘 (別忘了它是 java 偽裝的,而在開發的時多半還要再跑Emulator這隻同樣吃資源的怪獸),再加上Share code 的方式由 copy text 變成變輯圖片...除非想參加電視冠軍展示用樂高蓋出 101 的本事,不然,還是乖乖的用Eclipse + Android SDK吧。噢,對了,寫出來的 APK 檔案大小為 3.96 MB,用正統的方式寫一個做一樣事的只要 229 KB,這中間肯定是有什麼誤會....

謹以此文記念2010 第一個也是最後一個 appInventor 程式 (聽說2010也只剩十天不到了)

Ref :
什麼都在裡面的官網

1 則留言: