2015年9月5日 星期六

用 cordova 的 file plugin 苦讀 sdcard 最精簡的完整示範

ls-sdcard 執行結果 如何用 cordova 的 file plugin 讀取 /sdcard 的內容? 請到 cordova-examples 下載、 解壓縮我寫的 cordova 範例程式。 然後建立你自己的 cordova project 並且把其中的 ls-sdcard 子目錄拷貝過去、 編譯、 執行:

cordova create ls-sdcard 網域.你自己的.ls-sdcard
cd ls-sdcard/
cordova platform add android
rm -rf www/*
cp .../解壓縮後的某處/ls-sdcard/* www/
cordova plugin add org.apache.cordova.file
cordova build
# 連上手機/平板或啟動模擬器
cordova run

OK, 我來解釋一下為什麼你花十分鐘完成的事, 我雖然沒有苦讀十年, 卻也花了 [暑假相對閒閒沒事的] 一整個星期。 只有 index.html 跟 main.js 兩個檔, 其中的程式碼不到三十列耶... 為~~什~~麼~~那麼困難?

一開始搜尋不到一個完整簡單的範例, 只知道要用到 cordova file plugin。 後來終於找到 Coding Grapes 的一個完整範例 Raymond Camden 的另一個更長的完整範例 Raymond Camden 的寫入檔案範例 還有 Eric Bidelman 的詳盡教學文

執行時, 從 logcat 看到一段錯誤訊息, 系統抱怨欠缺 「Content-Security-Policy」。 於是照著 whitelist plugin 的建議 在 index.html 加上一段看不是很懂的 <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">。 貴哥手賤, 就是喜歡刪掉一些看不懂的東西、 喜歡用最短的寫法, 結果刪了就真的不能動了, 那就只好照抄吧。 最後發現 Raymond Camden 跟我一樣幾乎被這東東打敗, 不過他詳細地分析並解釋, 還列出實驗結果。

再來是路徑的寫法。 不知是因為版本不同還是怎樣, 在網路上讀到一些不同的寫法。 總之我最後試成功的寫法是: window.resolveLocalFileSystemURL("file:///sdcard/", ...);

另外, 如果你有點進去一兩個上述完整範例看的話, 就會發現我的程式看起來算是比較簡單的。 嚇屎我也, 光是讀個目錄就要三層 callback! 我不知道 nodejs 的朋友們平常怎麼過日子; 但大部分時候我對於平行處理一點都沒興趣啊! 為什麼要讓這麼不方便的機制佔據你大部分的程式碼、 腦袋、 跟除錯時間呢? (現在才發現? 根本就是自爆跟 javascript 不熟 ^_^|||) 為了消除這個困擾, 又搜尋到 js 世界對於 callbacks 的解決方案: promise。 嗯, 看起來很 promising。 筆記一下連結, 以後可能用得到:

  1. JavaScript Promises Promises – an alternative way to approach asynchronous JavaScript
  2. JavaScript Promises – a comparison of libraries
  3. JavaScript Promise 迷你书
  4. [译] 深入理解 Promise 五部曲:2. 控制权转换问题 (含整系列中英文連結)

這件事如果用 perl 來做, 這樣就完成了: perl -e 'system("ls /sdcard")' 咦,有人抗議這是偷吃步? OK, 那就用規矩的寫法: perl -e 'opendir($dh, "/sdcard"); print join("\n", readdir(dh))' 如果用 python 來做, 這樣就完成了: python -c 'import glob; print "\n".join(glob.glob("/*"))' (因為我對 python 不熟, 所以花了十幾分鐘才研究出來。) 這才是正常的程式語言啊! 在 PC 上就算用 C 或組合語言來寫相同的程式, 也不需要超過一小時/一天啊! 但為什麼我們在手機平板上面, 就不能夠享有一個正常簡單健康多元的開發環境呢? 好可惜支援多種語言的 Scripting Layer for Android 計畫停掉了。 還好還有 kivyQPython (以及 兩者的合體)

總之結論就是: 不要跟低階的 cordova API 纏鬥。 跟它認真你就輸了。 趕快改學 phonon 官網推薦的較高階 UI 框架 吧。

沒有留言:

張貼留言