2012-05-25 9 views
7

में गैर-अंग्रेज़ी वर्णों को इंजेक्शन देना मैं रिमोट कंट्रोल ऐप पर प्रोग्रामिंग कर रहा हूं। कार्यों में से एक अक्षर अक्षर इंजेक्शन है। कोड मैं वर्तमान में इस तरह दिखता उपयोग कर रहा हूँ:एंड्रॉइड

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 बॉक्स में दिखाई)। हालांकि, अगर मैं इंजेक्ट करने की कोशिश कर रहा हूं उदा। कोरियाई पात्र, यह विफल रहता है। जब मैं कोरियाई भाषा और कीबोर्ड कॉन्फ़िगर करता हूं तब भी फ़ंक्शन प्राप्त होता है।

मुझे पता है कि सीधे तार इंजेक्शन लगाने के लिए एक और तरीका है:

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); 

मेरे रिमोट कंट्रोल एप्लिकेशन जो गतिविधि के लिए घटनाओं कोई फर्क नहीं पड़ता इंजेक्षन की जरूरत है। यह इंस्ट्रुमेंटेशन (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

मैं के रूप में अतिरिक्त जानकारी के ऊपर हिस्सा छोड़ दें। मुझे एक समाधान मिला है। इसके लिए रूट होना आवश्यक है, लेकिन यदि आप एप्लिकेशन कुंजी से साइन इन कर सकते हैं तो मुझे लगता है कि यह कोई समस्या नहीं है। आप वर्चुअल.केसीएम (/system/usr/keychars/Virtual.kcm) फ़ाइल को संपादित कर सकते हैं, जो कि डिफ़ॉल्ट कुंजी वर्ण मानचित्र (केसीएम) है। आप अपने इच्छित चरित्र को जोड़ सकते हैं, और फिर Instrumentation.sendStringSync (स्ट्रिंग स्ट्रिंग) विधि का उपयोग कर सकते हैं, क्योंकि यह नए केसीएम से KeyEvents उत्पन्न करने में सक्षम होगा।

मुझे फोन पर केसीएम संपादित करने में कुछ समस्याएं थीं, इसलिए मैंने इसे कंप्यूटर पर कॉपी करने के लिए किया था, इसे वहां संपादित किया था और फिर इसे डिवाइस पर वापस कॉपी किया था।

मुझे आशा है कि इससे मदद मिलती है!


इस link में, निम्न सामग्री प्रकट होती है। यह सीम करता है कि वर्चुअल कीबोर्ड में यूएस कुंजी कैरेक्टरमैप और लेआउट होता है, इससे कोई फर्क नहीं पड़ता कि आप सेटिंग्स पर क्या चुनते हैं। मैं इसे हल करने का कोई तरीका नहीं ढूंढ पाया।

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.