2009/01/25

x86版 Android で SoftKeyboard を表示させる

VMware 上で x86 版の Android で SoftKeyboard を起動すると、例外が発生してしまい、機能しません


logとコードを眺めていたら、現在 android 上で使用しているWindowManager の実装が InputMethod へ対応していないことが分かりました。

VMware 用のバイナリを作る為に、私は手抜きをして、eee_701 用の構成をそのまま使っているのですが、vendor/asus/eee_701/eee_701.mk で明示されている通り、この構成では policy として mid が指定されています。

このため、WindowManager の実装には、frameworks/policies/base/mid/com/android/internal/policy/impl/の MidWiondowManager.java が使われることになるのですが、このコードには、TYPE_INPUT_METHOD タイプ の Window 処理コードが含まれていないため、Permission Denied エラーとなってしまうようです。

phone policy用の WindowManager であるPhoneWindowManager.javaでは、このあたりを処理するコードが追加されているので、コピーしてこようとしたのですが、改変箇所が多く、意外に面倒そう...。というわけで、素直に(?) polocy を phone に切り替えてしまいました(手抜き)。

ただし、SoftKeyboard.java は InputMethodService を継承して作られているもののonEvaluateInputViewShown() と、onEvaluateFullscreenMode() とを overwrite していません。そのため、「ハードウェアキーボードがあり、かつ、現在LandScapeである」と判断されると、SoftwareKeyboard が disable されてしまいます。

そこで、SoftKeyboard.java でこれら関係するメソッドを適当に上書き。

public boolean onEvaluateInputViewShown() {
return true;
}
public boolean onEvaluateFullscreenMode() {
return false;
}
結果、Notepad で SoftwareKeyboard が表示されるようになりました。


とは言うものの、現在の実装上、ソフトウェアキーへフォーカスが当たらないので、実は全く意味はないのですけれど... (^^;。

また、私がdisable 時の対処などをまともに hook していないためなのでしょう、SearchBar でSoftKeyboard を有効にして、そのまま Browser へなだれ込むと、キーボードが出っぱなしになってしまったりもして...(^^;;;。


 うむ、素直に邪魔ですね(Notepadを起動することで復活できます)。

1.5版が正式コードになる日が楽しみです。

0 件のコメント:

コメントを投稿