2012-05-25 21 views
7

私はリモコンアプリでプログラミングしています。タスクの1つは、文字を注入することです。私は現在、このようになりますを使用していますコード:Androidで英語以外の文字を入力する

Instrumentation instr = new Instrumentation(); 

String str="a"; 

// basically the same like calling instr.sendStringSync(str); 
char[] chars = str.toCharArray(); 
KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 
KeyEvent[] keyEvents = keyCharacterMap.getEvents(chars); 
if (keyEvents != null) { 
    for (KeyEvent kev : keyEvents) { 
     instr.sendKeySync(kev); 
    } 
} 

英語の文字の上に完璧に動作します(文字はのEditTextボックスに表示)。しかし、例えば私が注射しようとしている場合。韓国語の文字では、これは失敗します。韓国語とキーボードを設定していても、getEvents関数はnullを返します。

は、私が直接文字列を注入するための別の方法があります知っている:

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0); 
instr.sendKeySync(event); 

これではありません作業のどちらか - 何のEditTextボックスに示されている文字、およびonKeyMultipleは()のいずれか私のテストアクティビティで呼び出されていないされていません。

同じイベントでdispatchKeyEvent()は私のテスト活動に働くので、これは奇妙です:

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0); 
dispatchKeyEvent(event); 

私のリモコンアプリがイベントにアクティビティに関係なくを注入する必要があります。これはInstrumentation(android.permission.INJECT_EVENTSとプラットフォームキーの署名付き)を使用して可能です。

インスツルメンテーションを使用して英語以外の文字を挿入するにはどうすればよいですか? これを行う別の方法はありますか?例えば。 dispatchKeyEventの使用(他のアクティビティやアプリケーションでも動作する必要があります)

+0

現時点で同じ問題が発生しています。誰のアイデアですか? – Sprigg

+0

'm_KeyCharacterMap'が実際に' keyCharacterMap'であると仮定しますか? –

+0

あなたは正しいです。私はコードを修正しました。 – kahlk

答えて

-2

あなたはのEditTextのために、この方法とInputFilterを使用することができます。

private boolean isLatinSymbolOrDigit(char c) 
{ 
    // Allow [a-zA-Z0-9] 
    if ('0' <= c && c <= '9') 
     return true; 
    if ('a' <= c && c <= 'z') 
     return true; 
    if ('A' <= c && c <= 'Z') 
     return true; 
    return false; 
} 

InputFilter filter = new InputFilter() 
{ 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
    { 
     for (int i = start; i < end; i++) 
     { 
      if (isLatinSymbolOrDigit(source.charAt(i))) 
      { 
      }     
      else 
      { 
       //wrong character 
       return ""; 
      } 
     } 
     return null; 
    } 
}; 

editText.setFilters(new InputFilter[] {filter}); 
+0

申し訳ありませんが、あなたの答えは質問された質問とは関係ありません。 – Sprigg

+0

注射するのではなく、吐き出すのが間違っていることは分かっています。 –

2

私はなどの追加情報上記の部分を残します。私は解決策を見つけました。それにはrootが必要ですが、アプリケーション鍵で署名できるのであれば、それは問題ではないと思います。あなたができることはVirtual.kcm(/system/usr/keychars/Virtual.kcm)ファイルを編集することです。これはデフォルトのキー文字マップ(kcm)です。任意の文字を追加し、新しいkcmからKeyEventsを生成できるため、メソッドInstrumentation.sendStringSync(String string)を使用することができます。

私は電話でkcmを編集する際にいくつかの問題がありました。だから私はそれをコンピュータにコピーし、そこで編集してからデバイスにコピーし直しました。

こちらがお役に立てば幸いです。


このlinkには、次の内容が表示されます。設定に関係なく、仮想キーボードにはUS keyCharacterMapとレイアウトがあります。私はこれを解決する方法を見つけることができませんでした。

Language Note 

Android does not currently support multilingual keyboards. Moreover, the built-in generic key character map assumes a US English keyboard layout. 

OEMs are encouraged to provide custom key character maps for their keyboards if they are designed for other languages. 

Future versions of Android may provide better support for multilingual keyboards or user-selectable keyboard layouts. 
関連する問題