इनपुट विधि संपादक समर्थन

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

इन डिस्प्ले-विशिष्ट क्षेत्रों में किए गए अपडेट नीचे दिए गए हैं:

Android 10 नॉन-डिफॉल्ट डिस्प्ले पर चलने वाले ऐप्स के लिए सॉफ्टवेयर कीबोर्ड को सपोर्ट करता है।

गैर-डिफ़ॉल्ट डिस्प्ले पर चलने वाले ऐप्स

किस डिस्प्ले के संदर्भ में इनपुट मेथड एडिटर (IME) का सॉफ्टवेयर कीबोर्ड दिखाता है, इसके दो अलग-अलग मोड हैं। सॉफ्टवेयर कीबोर्ड निम्न पर प्रदर्शित होता है:

  • वही डिस्प्ले जिस पर फ़ोकस किया गया ऐप दिखाई देता है।
  • फ़ोकस किए गए ऐप के नॉन- डिफ़ॉल्ट डिस्प्ले पर चलने के दौरान डिफ़ॉल्ट डिस्प्ले।

सिस्टम यह निर्धारित करता है कि डिस्प्ले की सेटिंग के आधार पर किस मोड का उपयोग करना है, जिस पर केंद्रित ऐप दिखाई देता है। अधिक विवरण के लिए, देखें:

  • DisplayWindowSettings#shouldShowImeLocked()
  • DisplayWindowSettings#setShouldShowImeLocked()

चित्र 1. IME सॉफ़्टवेयर कीबोर्ड जैसा कि लक्ष्य ऐप सहित द्वितीयक डिस्प्ले पर दिखाई देता है

सिस्टम एकल IME का उपयोग करता है, लेकिन उपयोगकर्ता फ़ोकस का पालन करने के लिए डिस्प्ले के बीच बदलाव कर सकता है। Android 10 स्वचालित रूप से अपेक्षा करता है कि सभी प्रथम- और तृतीय-पक्ष IME लेआउट को संशोधित करें और बनाए जाने पर नए प्रदर्शन आकार के अनुसार आकार बदलें।

यदि डिस्प्ले ए पर एक सक्रिय कनेक्शन है, और इनपुट फ़ील्ड डिस्प्ले बी पर इनपुट फोकस का अनुरोध करता है, तो निम्न प्रवाह होता है:

  1. डिस्प्ले बी पर इनपुट फील्ड से एक नया इनपुट कनेक्शन आता है।
  2. InputMethodManagerService जाँचता है कि क्या कनेक्शन स्वीकृत होना चाहिए।
  3. IME के ​​लिए एक डिस्प्ले चुना गया है। यदि प्रदर्शन B IME दिखाने का समर्थन करता है और इसे दिखाने की अनुमति है, तो B का उपयोग किया जाता है। अन्यथा, प्राथमिक डिवाइस प्रदर्शन का चयन किया जाता है।
  4. यदि चयनित डिस्प्ले डिस्प्ले A से नहीं है, तो कनेक्शन फिर से स्थापित हो जाता है। InputMethodService नष्ट हो जाती है और फिर से बनाई जाती है।

सुरक्षा प्रतिबंध

सिस्टम उन वर्चुअल डिस्प्ले पर IME नहीं दिखाएगा जो सिस्टम के स्वामित्व में नहीं हैं। यह एक सुरक्षा चिंता के कारण है कि एक दुर्भावनापूर्ण ऐप सक्षम सिस्टम सजावट समर्थन के साथ वर्चुअल डिस्प्ले बना सकता है और सतह से उपयोगकर्ता-संवेदनशील जानकारी पढ़ सकता है, जैसे कि टाइपिंग पूर्वानुमान और कस्टम पृष्ठभूमि।

कार्यान्वयन

Android 9 (और निम्न) में, IME केवल डिफ़ॉल्ट स्क्रीन पर उपलब्ध था, जैसा कि ऑन-स्क्रीन इनपुट विधियों में वर्णित है। एंड्रॉइड 10 (और उच्चतर) में, एक उपयोगकर्ता फ़ोकस स्विच करके विभिन्न डिस्प्ले पर विभिन्न इनपुट टेक्स्ट फ़ील्ड के बीच स्विच कर सकता है, और IME विंडो सेकेंडरी डिस्प्ले में चली जाती है।

WindowManager में कार्यान्वयन IME स्थिति को प्रबंधित करने के लिए इनपुट विधि विंडो (IME विंडो जहां सॉफ्ट कीबोर्ड खींचा जाता है) और इनपुट विधि लक्ष्य (विंडो जहां IME इनपुट जाता है) को ट्रैक करता है।

InputMethodManagerService (IMMS) के लिए, कोई अन्य अंतर्निर्मित तंत्र InputMethodService (IMS) में प्रदर्शन परिवर्तन को प्रसारित नहीं कर सकता है और फ़ोकस को किसी अन्य डिस्प्ले पर ले जाने पर रनटाइम पर कीबोर्ड लेआउट को फिर से कॉन्फ़िगर कर सकता है।

डिस्प्ले के बीच IME विंडो स्विच प्राप्त करने के लिए, Android 10 निम्नलिखित को लागू करता है:

  • IME और इनपुट लक्ष्य विंडो को अब DisplayContent#mInputMethodWindow और DisplayContent#mInputMethodTarget #mInputMethodTarget में प्रति डिस्प्ले ट्रैक किया जाता है, ताकि WindowManager (WM) प्रत्येक डिस्प्ले से स्वतंत्र रूप से IME फ़ोकस स्थिति का प्रबंधन कर सके।
  • IMMS की तरफ, जब बाहरी डिस्प्ले से ऐप क्लाइंट का फोकस अनुरोध ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus के माध्यम से प्राप्त होता है, तो यह पहले वर्तमान इनपुट विधि सेवा को अनबाइंड करता है और फिर नए IME को फिर से जोड़ने के लिए सेवा को रीबाइंड करता है onServiceConnected() में बाहरी डिस्प्ले के लिए विंडो टोकन।
  • IMS की तरफ, IMS#attachToken प्राप्त होने के बाद, निम्न प्रवाह होता है:
    • ContextImpl#updateDisplay को InputMethodService#attachToken() में सेवा संदर्भ के प्रदर्शन को अपडेट करने के लिए कहा जाता है। यह कुंजीपटल के लेआउट को संशोधित करने और वर्तमान संदर्भ की जांच करने वाले लक्ष्य प्रदर्शन को अनुकूलित करने के लिए ViewGroup#addView() को कॉल करता है।
    • DisplayContent#setInputMethodWindowLocked() को कॉल करने के बाद, कार्यान्वयन संसाधनों को ओवरराइड करने और मेट्रिक्स प्रदर्शित करने के लिए WindowProcessController का उपयोग करके IME प्रक्रिया में प्रक्रिया-स्तरीय डिस्प्ले कॉन्फ़िगरेशन परिवर्तन भेजता है।
    • InputMethodService क्लाइंट को इनपुट दृश्य को फिर से शुरू करने के लिए onConfigurationChanged() और ViewGroup#addView() कॉल के बाद सही डिस्प्ले मेट्रिक्स के साथ सही कॉन्फ़िगरेशन मिलता है।

मल्टी-सेशन इनपुट मेथड एडिटर सपोर्ट

उपयुक्त इनपुट स्रोत प्रदान करने के लिए कई उपयोगकर्ताओं द्वारा एक साथ उपयोग किए जाने वाले कई डिस्प्ले वाले डिवाइस कार्यान्वयन को एक साथ कई इनपुट मेथड एडिटर्स (IME) प्रदर्शित करने के लिए कॉन्फ़िगर किया जा सकता है, अधिकतम एक प्रति डिस्प्ले। निम्नलिखित दो आंकड़े दो डिस्प्ले पर एक नमूना बहु-सत्र IME दिखाते हैं:

चित्र 2. नमूना बहु-सत्र IME

चित्र 3. नमूना बहु-सत्र IME

इस सुविधा के लिए प्रति-प्रदर्शन फ़ोकस के लिए समर्थन एक पूर्वापेक्षा है। यदि नहीं, तो यह सुविधा सक्षम नहीं की जा सकती। सुरक्षा प्रतिबंधों के कारण, प्रति-प्रदर्शन फोकस सीमा ने इस सुविधा को उपकरणों के एक छोटे उपसमुच्चय तक सीमित कर दिया।

एंड्रॉइड 10 में, मल्टी-सेशन IME के ​​लिए समर्थन अलग सिस्टम सेवाओं के साथ एपीआई के एक अलग सेट और कम कार्यक्षमता के साथ लागू किया गया है। बहु-सत्र IME मौजूदा IME के ​​साथ संगत नहीं है। या तो बहु-सत्र या एकल-सत्र सेवा का उपयोग किया जा सकता है, लेकिन दोनों का नहीं।

InputMethodService वर्ग के शीर्ष पर निर्मित मौजूदा Android IME का उपयोग करना संभव नहीं है क्योंकि Android IME API को Android 1.5 में पेश किए जाने और InputMethodService में कई सार्वजनिक API से पहले यह धारणा बनाई गई थी कि एक IME क्लाइंट को एक ही समय में केंद्रित किया जा सकता है। पहले से ही उस धारणा पर बहुत अधिक निर्भर थे। हालाँकि, बहु-क्लाइंट परिदृश्य का समर्थन करने के लिए InputMethodService वर्ग को अपडेट करना चुनौतीपूर्ण है क्योंकि:

  1. ऐसा करने से InputMethodService में एक अस्वीकार्य मात्रा में जटिलता आ जाएगी, जिसे बनाए रखना पहले से ही कठिन है।
  2. IME डेवलपर्स को अभी भी कई केंद्रित IME क्लाइंट से समानांतर अनुरोधों का समर्थन करने में सक्षम होने के लिए अपने कार्यान्वयन को अपडेट करने की आवश्यकता है, जिसके लिए उनके पक्ष में एक गैर-तुच्छ रीडिज़ाइन की आवश्यकता हो सकती है (जैसे इनपुट डिकोडर और टाइपिंग इतिहास डेटाबेस)।
  3. मल्टी-IME क्लाइंट के लिए वास्तविक उपयोग के मामले तेजी से विकसित होने की उम्मीद है, इसलिए नया प्रोटोकॉल स्थिर नहीं है और सार्वजनिक API के रूप में प्रदर्शित होने के लिए तैयार नहीं है।

एकल-सत्र (नियमित) IME के ​​साथ, अलग-अलग डिस्प्ले पर IME दिखाने पर नियंत्रण DisplayWindowSettings का उपयोग करके किया जाता है।

एक नमूना बहु-सत्र IME है जो development/samples/MultiClientInputMethod पर स्थित है।

बहु-सत्र IME का परीक्षण करने के लिए:

  1. config_perDisplayFocusEnabled को true पर सेट करें।
  2. इन आदेशों को चलाएँ:
    1. $ make -j MultiClientInputMethod
    2. $ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
    3. $ adb root
    4. $ adb shell setprop persist.debug.multi_client_ime \
      com.example.android.multiclientinputmethod/.MultiClientInputMethod
    5. $ adb reboot
  3. एकाधिक पाठ इनपुट परिदृश्यों का प्रयास करें।

कार्यान्वयन

कार्यान्वयन विवरण के लिए MultiClientInputMethodManagerService देखें।