2012-05-25 64 views
7

Tôi đang lập trình trên một ứng dụng điều khiển từ xa. Một trong những nhiệm vụ là tiêm ký tự. Mã tôi hiện đang sử dụng trông giống như sau:Tiêm các ký tự không phải tiếng Anh trong 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); 
    } 
} 

Điều đó hoạt động hoàn hảo trên ký tự tiếng Anh (Các ký tự hiển thị trong hộp EditText). Tuy nhiên, nếu tôi đang cố gắng tiêm, ví dụ: Nhân vật Hàn Quốc, điều này không thành công. Hàm getEvents trả về null, ngay cả khi tôi đã cấu hình ngôn ngữ và bàn phím tiếng Hàn.

Tôi biết có một phương pháp khác để tiêm chuỗi trực tiếp:

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

Đây không phải là làm việc một trong hai - không có ký tự thể hiện trong hộp EditText, và onKeyMultiple() không được gọi là một trong hai hoạt động thử nghiệm của tôi.

Đây là kỳ lạ kể từ khi dispatchKeyEvent() với cùng một sự kiện làm việc trong hoạt động thử nghiệm của tôi:

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

ứng dụng điều khiển từ xa của tôi cần phải tiêm các sự kiện không có vấn đề mà hoạt động. Điều này có thể sử dụng Thiết bị đo đạc (với android.permission.INJECT_EVENTS và chữ ký có khóa nền tảng).

Tôi làm cách nào để chèn ký tự không phải tiếng Anh bằng cách sử dụng thiết bị đo đạc? Có cách nào khác để thực hiện việc này không? Ví dụ. Sử dụng dispatchKeyEvent (cũng phải làm việc cho các hoạt động/ứng dụng khác).

+0

tôi đang gặp sự cố tương tự tại thời điểm này. Có ý kiến ​​gì không? – Sprigg

+0

giả sử rằng 'm_KeyCharacterMap' thực sự là' keyCharacterMap'? –

+0

bạn đã đúng. Tôi đã sửa mã. – kahlk

Trả lời

-2

Bạn có thể sử dụng phương pháp này và InputFilter cho 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

Xin lỗi, nhưng câu trả lời của bạn không liên quan gì đến câu hỏi được hỏi. – Sprigg

+0

Tôi biết đó là sai lầm của tôi bị đẩy ra thay vì tiêm chích. –

2

tôi rời khỏi phần trên thông tin như thêm. Tôi đã tìm ra một giải pháp. Nó đòi hỏi phải có gốc, nhưng nếu bạn có thể đăng nhập với khóa ứng dụng, tôi đoán đó không phải là một vấn đề. Những gì bạn có thể làm là chỉnh sửa tệp Virtual.kcm (/system/usr/keychars/Virtual.kcm), đây là bản đồ ký tự khóa mặc định (kcm). Bạn có thể thêm bất kỳ ký tự nào bạn muốn, và sau đó sử dụng phương thức Instrumentation.sendStringSync (String string), vì nó sẽ có thể tạo KeyEvents từ kcm mới.

Tôi gặp một số sự cố khi chỉnh sửa kcm trên điện thoại, vì vậy những gì tôi đã làm là sao chép nó trên máy tính, chỉnh sửa ở đó và sau đó sao chép nó trở lại thiết bị.

Tôi hy vọng điều này sẽ hữu ích!


Trong này link, nội dung sau sẽ xuất hiện. Nó đường nối rằng bàn phím ảo có một keyCharacterMap và layout của Mỹ, bất kể bạn chọn gì trên các thiết lập. Tôi đã không thể tìm ra cách để giải quyết vấn đề này.

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. 
Các vấn đề liên quan