2012-05-25 75 views
7

我正在編寫一個遠程控制應用程序。其中一項任務是注入字符。我目前使用的代碼如下所示:在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

我現在有同樣的問題。任何想法的人?假設'm_KeyCharacterMap'實際上是'keyCharacterMap'? – Sprigg

+0

? –

+0

你是對的。我更正了代碼。 – kahlk

回答

-2

您可以使用此方法,並輸入過濾器的EditText上:

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)。你可以添加你想要的任何字符,然後使用Instrumentation.sendStringSync(String string)方法,因爲它可以從新的kcm生成KeyEvent。

我在編輯手機上的kcm時遇到了一些問題,所以我做的是將它複製到計算機上,在那裏編輯它,然後將其複製回設備。

我希望這有助於!


在此link中,出現以下內容。無論您在設置上選擇什麼,它都會接觸到虛擬鍵盤具有美國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.