2

私は Android 開発に不慣れで、現在 Google Android オペレーティング システム (API レベル 11 == バージョン 3.0) 用のインプット メソッド エディター (IME) をプログラミングしています。

(次のコードは、問題を指摘するために単純化されています。)

次の方法で、基になるアプリケーションに文字を送信できます。

@Override
public final void onKey(final int primaryCode, final int[] keyCodes) {    
    this.getCurrentInputConnection().commitText(String.valueOf((char) primaryCode), 1);
}

ここで、特別なキーの組み合わせ (SHIFT + A など) を送信したいと考えています。この目標を達成するための Java コードは次のとおりです (SHIFT + A の特殊なケースの場合)。

@Override
public final void onKey(final int primaryCode, final int[] keyCodes) {
        long eventTime = SystemClock.uptimeMillis();    
        this.sendDownKeyEvent(KeyEvent.KEYCODE_SHIFT_LEFT);

        KeyEvent keyEvent = new KeyEvent(
            eventTime,
            eventTime,
            KeyEvent.ACTION_DOWN,
            KeyEvent.KEYCODE_A, // ToDo: How to convert primaryCode to the corresponding KeyEvent constant?
            KeyEvent.META_SHIFT_ON
        );
        this.getCurrentInputConnection().sendKeyEvent(keyEvent);
}

public final void sendDownKeyEvent(final int keyEventCode) {
    InputConnection ic = this.getCurrentInputConnection();
    if (ic != null) {
        long eventTime = SystemClock.uptimeMillis();
        ic.sendKeyEvent(
            new KeyEvent(
                eventTime, eventTime,
                KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,
                KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE
            )
        );
    }
}

前のコード サンプルのコメントは、私の問題を示しています。KeyEventオブジェクトを介してキーの組み合わせを送信するには、変数primaryCode (押されたキーの Unicode コードを含む) をクラスKeyEventの定数に変換する必要があります。

この場合の便利な方法は既に存在しますか、それとも自分で作成する必要がありますか? 一般的に:キーの組み合わせを送信する上記のソリューションはエレガントですか、それともより良いアプローチが存在しますか? (インターネット上で Android IME の例を見つけるのは簡単ではありません...)

前もって感謝します!

4

1 に答える 1

1

A little late it seems. I found the following solution to the same issue, translating a primaryCodeinto a sequence of KeyEvents.

The solution involves loading a KeyCharacterMap and using its KeyCharacterMap.getEvents() method to get a KeyEvent list that can reproduce the character.

//This snippet tries to translate the glyph 'primaryCode' into key events

//retrieve the keycharacter map from a keyEvent (build yourself a default event if needed)
KeyCharacterMap myMap=KeyCharacterMap.load(event.getDeviceId()); 

//event list to reproduce glyph
KeyEvent evs[]=null;

//put the primariCode into an array
char chars[]=new char[1];
chars[0]=primaryCode;

// retrieve the key events that could have produced this glyph
evs=myMap.getEvents(chars);

if (evs != null){
    // we can reproduce this glyph with this key event array
    for (int i=0; i< evs.length;i++) MySendKeyEventHelperMethod(evs[i]);
}
else { /* could not find a way to reproduce this glyph */ }
于 2011-11-01T18:49:33.013 に答える