如何用 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。 筆記一下連結, 以後可能用得到:
- JavaScript Promises Promises – an alternative way to approach asynchronous JavaScript
- JavaScript Promises – a comparison of libraries
- JavaScript Promise 迷你书
- [译] 深入理解 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 計畫停掉了。 還好還有
kivy 跟 QPython
(以及
兩者的合體)
總之結論就是: 不要跟低階的 cordova API 纏鬥。 跟它認真你就輸了。 趕快改學 phonon 或 官網推薦的較高階 UI 框架 吧。
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。