(還不是真的) Android 中文注音輸入法
Android 甫推出,就受到極大的矚目,尤其是 Google 還辦了一個 Android Developer Challenge 的計畫,拿出一千萬美元的獎金,獎勵在 Android 平台上的好 idea。
我簡單地瀏覽了一下 Android 的 API,發現在上面寫 AP 實在是簡單到不行。可能學過 java 幾個月的大學生,都有辦法寫出不錯的 application。好用的 API 實在是平台興盛的要素之一啊。
然後我就不小心寫出了個(還不是真的) Android 中文注音輸入法來。這實在是因為 Android 已經準備好了一個 TextInputMethod 的 class,只要繼承之,實作出自己的 keys to input 的轉換規則,然後要用的地方再 setInputMethod() 或於其 layout xml 裡設定一下 android:inputMethod,一切就搞定了。
不過,由於我還找不到,怎樣讓這個輸入法,能夠在任何不是自己寫的程式裡開啟。在不能夠 globally activable 的情況下,還只能算是個「還不是真的」輸入法。這個問題,是目前最需要被解決的問題。
除了不能 globally activable 之外,我本來想要把輸入法表格先匯入 SQLite 資料庫裡,然後於輸入時查詢對應。一來能夠享用 SQLite 的快速查詢能力,二來 SQLite 也是 Android 官方的資料儲存方式。不過,資料庫都建好了,也用 adb push 放在文件說的標準位置,也直接用 adb shell 進去開 sqlite3 讀取都沒問題了,但不知道是我的程式寫法有問題,還是 Android 剛出來 bug 一堆,我 getContext() 之後,用 Context.openDatabase() 總是會失敗。最後只好把整個表格,hard-coded 進程式碼裡,這當然造成了啟動速度緩慢的副作用。
這個(還不是真的)Android 中文注音輸入法的執行情形如下面的影片:
由於使用了來自 OpenVanilla 的 bpmf.cin 表格,OpenVanilla 採 New BSD 授權,故本輸入法亦採同樣的 New BSD 授權[1]。程式碼下載:申請了一個 Google Code hosting,您可以從 androidcin 這個專案下載到 AndroidCIN-v0.1.zip。AndroidCIN-v0.1.zip。
bpmf.cin表格本身有沒有 GPL 的問題,我就不清楚了。 ↩



9 Comments
原來還不是真的。
關於怎麼在一般的程式被叫起來,查http://code.google.com/android/intro/anatomy.html
Android的程式中有service一類的無UI的型式,也許要從這個方向做。
Hi Jeff您好:
我在http://opensource.javaworld.com.tw有成立一個Android的繁體中文文件翻譯計劃, 在這個Portal我們也非常歡迎已經寫一些Android的Sample code的開發者將您的source code或是文件分享出來, 我很找就看到您寫的Sample Demo感到萬分佩服, 所以想利用http://opensource.javaworld.com.tw這個Portal聚集一些對Android有興趣的開發者與相關Wiki文件, Sample code分享,非常歡迎您的參與, 詳細參與細節請到http://opensource.javaworld.com.tw/cb/proj/summary.do?proj_id=23
MaoYang
你好, 我也對開發android中文輸入法有興趣
很高興用到你的程式
但執行時卻有少許問題...
我是用英文版的eclipse, 所以把你原本MS950轉成UTF-8
另外, XML 檔案亦加了些改動才正常開啟PROJECT, 改動如下
action android:name="android.intent.action.MAIN"
"name"原是"value"
最後執行後, 系統出了exception
請問如何解決?
或可以email指教, 謝謝
HelloAndroid3,
您好。:-)
我的原始碼是用 utf-8 編碼,你做的是可能是修改 eclipse 設定,讓 eclipse 將原始碼檔案,預設視作為 utf-8 編碼。否則,在 windows 上 eclipse 會依照系統 locale 設定的字元編碼,也就是 cp950,讀取原始碼檔案。將 utf-8 編碼的檔案,以 cp950 編碼的檔案讀取,就會發生問題。
至於 AndroidManifest.xml,我猜是 Android SDK 新版的改便所造成的不相容。我用的 Android SDK 版本為 android_sdk_windows_m3-rc20a。目前最新版應該是 android-sdk_m5-rc14_windows,我還沒有在最新版測試過。請問您碰到的 exception 是什麼呢?
Jeff Hung
謝謝
我現在已經可以用你的輸入法了
原來是m3升m5有些格式改變了,
http://code.google.com/android/migrating/m3-to-m5/m5-api-changes.html
我只改了 xml, layout便行了
另外, 你那些perl script(cin2java.pl和cin2sq3.pl)有甚麼用的?
那個im.db和bpmf.cin應該是你在用不同的database方法吧
HelloAndroid3,
是的。就如同我在文中所提到的,正常來說,應該要把輸入法表格放在 sqlite 資料庫裡,這樣才好依需要載入不同的輸入法。但是因為我弄不出怎樣在程式裡讀取 sqlite 資料庫,因此最後只好把表格 hard-code 進 java 程式裡,這也造成程式啟動速度過慢的問題。
cin2java.pl 與 cin2sq3.pl 分別是用來把 CIN 表格轉換成 java 程式或 sqlite3 資料庫用的。
Jeff Hung
Jeff,謝謝 =]
我也在研究用SQLite,
請問能否給我你用了SQLite後的源碼?
我想知怎麼用SQLite^^
Hi Jeff,
我用了以下的sample來研究SQLite
http://code.google.com/android/intro/tutorial.html
執行了當中exercise3後, 在emulator中輸入了一些note data,
exercise3會以"notes"作為table名稱, 儲存data
亦在console輸入以下指令....
>adb shell
#sqlite3 /data/data/com.google.android.notepad3/database
sqlite>.table
發現沒有任何table, 為什麼會這樣?
另外, 這個sample是以每次輸入的方式儲存data,
但輸入法的字庫是不可能這樣做的
所以, 你的"*.db"檔是放到哪裡用的?又怎麼樣連接的?
而且你用甚麼方法管理檔案的資料?
問題很多, 請見諒^^
謝謝
Android LIME的作者已將其輸入法原始碼hosting在Google應可找到方法使用,請見此處http://code.google.com/p/limeime/
Post a Comment