इमेज कीबोर्ड की सुविधा

लोग अक्सर इमोजी, स्टिकर, और दूसरी तरह के रिच कॉन्टेंट का इस्तेमाल करके बातचीत करना चाहते हैं कॉन्टेंट. Android के पिछले वर्शन में, सॉफ़्ट कीबोर्ड—जिसे इनपुट के तरीके के एडिटर या IME—ऐप्लिकेशन को सिर्फ़ यूनिकोड इमोजी भेजा जा सकता है. रिच कॉन्टेंट के लिए, ऐप्लिकेशन के लिए खास तौर पर बनाए गए ऐसे एपीआई जिन्हें अन्य ऐप्लिकेशन में इस्तेमाल नहीं किया जा सकता या इस तरह के काम किए जा सकते हैं आसान शेयर कार्रवाई से इमेज भेजना या क्लिपबोर्ड पर कॉपी करें.

इमेज खोजने की सुविधा वाला कीबोर्ड दिखाने वाली इमेज
पहली इमेज. इमेज कीबोर्ड की सुविधा का उदाहरण.

Android 7.1 (एपीआई लेवल 25) और Android के SDK टूल में, Commit Content API, जो IME को इमेज और अन्य रिच कॉन्टेंट को सीधे किसी ऐप्लिकेशन के टेक्स्ट एडिटर में. यह एपीआई इसमें भी उपलब्ध है वर्शन 25.0.0 के रूप में अपडेट किया गया है. हमारा सुझाव है कि आप सहायता केंद्र लाइब्रेरी, क्योंकि इसमें लागू करने के तरीके को आसान बनाने के लिए हेल्पर मेथड शामिल हैं.

इस एपीआई की मदद से, ऐसे मैसेजिंग ऐप्लिकेशन बनाए जा सकते हैं जो किसी भी साथ ही, ऐसे कीबोर्ड भी होते हैं जो किसी भी ऐप्लिकेशन पर रिच कॉन्टेंट भेज सकते हैं. Google कीबोर्ड और Messages by Google कमिट Content API के साथ काम करती हैं, जैसा कि पहली इमेज में दिखाया गया है.

इस दस्तावेज़ में बताया गया है कि IME और दिखाई देता है.

यह कैसे काम करता है

कीबोर्ड इमेज इंसर्शन के लिए IME और ऐप्लिकेशन का इस्तेमाल करना ज़रूरी है. कॉन्टेंट बनाने नीचे दिए गए क्रम में, इमेज डालने की प्रोसेस के हर चरण के बारे में बताया गया है:

  1. जब उपयोगकर्ता EditText पर टैप करता है, संपादक, ऐसे MIME कॉन्टेंट टाइप की सूची भेजता है जिन्हें वह EditorInfo.contentMimeTypes.

  2. IME, कॉन्टेंट टाइप की सूची को पढ़ता है और कॉन्टेंट को सॉफ़्ट कलर में दिखाता है ऐसा कीबोर्ड जिसे संपादक स्वीकार कर सकता है.

  3. जब उपयोगकर्ता कोई इमेज चुनता है, तो IME कॉल commitContent() और किसी को InputContentInfo एडिटर को भेजा जा सकता है. commitContent() कॉल commitText() कॉल, लेकिन रिच कॉन्टेंट के लिए. InputContentInfo में एक ऐसा यूआरआई है जो किसी कॉन्टेंट में मौजूद कॉन्टेंट की पहचान करता है कंपनी खोलें.

इस प्रोसेस को दूसरी इमेज में दिखाया गया है:

ऐप्लिकेशन से IME और वापस ऐप्लिकेशन का क्रम दिखाने वाली इमेज
दूसरी इमेज. ऐप्लिकेशन फ़्लो के लिए IME में ऐप्लिकेशन.

ऐप्लिकेशन में इमेज इस्तेमाल करने की सुविधा जोड़ें

IME से रिच कॉन्टेंट स्वीकार करने के लिए, ऐप्लिकेशन को IME को यह बताना होगा कि वह किस तरह का कॉन्टेंट टाइप करता है स्वीकार करता है और एक कॉलबैक विधि को तय करता है जिसे कॉन्टेंट मिलने पर एक्ज़ीक्यूट किया जाता है. इस उदाहरण में, PNG स्वीकार करने वाले EditText को बनाने का तरीका बताया गया है इमेज:

Kotlin

var editText: EditText = object : EditText(this) {
    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
        var ic = super.onCreateInputConnection(outAttrs)
        EditorInfoCompat.setContentMimeTypes(outAttrs, arrayOf("image/png"))
        val mimeTypes = ViewCompat.getOnReceiveContentMimeTypes(this)
        if (mimeTypes != null) {
            EditorInfoCompat.setContentMimeTypes(outAttrs, mimeTypes)
            ic = InputConnectionCompat.createWrapper(this, ic, outAttrs)
        }
        return ic
    }
}

Java

EditText editText = new EditText(this) {
    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        InputConnection ic = super.onCreateInputConnection(outAttrs);
        EditorInfoCompat.setContentMimeTypes(outAttrs, new String[]{"image/png"});
        String[] mimeTypes = ViewCompat.getOnReceiveContentMimeTypes(this);
        if (mimeTypes != null) {
            EditorInfoCompat.setContentMimeTypes(outAttrs, mimeTypes);
            ic = InputConnectionCompat.createWrapper(this, ic, outAttrs);
        }
        return ic;
    }
};

आगे की जानकारी नीचे दी गई है:

  • यह उदाहरण सपोर्ट लाइब्रेरी का इस्तेमाल करता है, इसलिए यहां कुछ रेफ़रंस दिए गए हैं, android.support.v13.view.inputmethod के बजाय android.view.inputmethod.

  • यह उदाहरण एक EditText बनाता है और उसे onCreateInputConnection(EditorInfo) तरीका बदलने का तरीका InputConnection. InputConnection, IME और इनपुट मिल रहा है.

  • कॉल super.onCreateInputConnection() टेक्स्ट भेजने और पाने जैसे बिल्ट-इन व्यवहार को बनाए रखता है—और InputConnection का रेफ़रंस देता है.

  • setContentMimeTypes() इससे, इस्तेमाल किए जा सकने वाले MIME टाइप की सूची EditorInfo. कॉल करें setContentMimeTypes() से पहले super.onCreateInputConnection().

  • जब भी IME कॉन्टेंट शेयर करता है, तब callback चालू होता है. तरीका onCommitContent() के पास इससे जुड़ा रेफ़रंस है InputContentInfoCompat, जिसमें एक कॉन्टेंट यूआरआई मौजूद है.

    • अगर आपका ऐप्लिकेशन, एपीआई लेवल 25 पर चल रहा है, तो अनुमतियों का अनुरोध करें और उन्हें रिलीज़ करने की अनुमतियां दें या उससे ज़्यादा और INPUT_CONTENT_GRANT_READ_URI_PERMISSION फ़्लैग को IME द्वारा सेट किया जाता है. अगर आपने ऐसा नहीं किया है, तो आपके पास कॉन्टेंट का ऐक्सेस पहले से ही मौजूद है यूआरआई, क्योंकि इसे IME या कॉन्टेंट देने वाले ने अनुमति दी है ऐक्सेस पर पाबंदी नहीं लगाता. ज़्यादा जानकारी के लिए, इमेज में जोड़ी गई सुविधा जोड़ें IME.
  • createWrapper() InputConnection, बदली गई EditorInfo, और कॉलबैक को रैप करता है एक नए InputConnection में कर देता है और उसे वापस भेजता है.

यहां कुछ तरीके सुझाए गए हैं:

  • जिन एडिटर के पास रिच कॉन्टेंट की सुविधा नहीं होती उन्हें कॉल नहीं किया जा सकता setContentMimeTypes(), और वह अपने EditorInfo.contentMimeTypes को सेट छोड़ देता है null तक.

  • अगर InputContentInfo में MIME टाइप दिया गया है, तो संपादक कॉन्टेंट को अनदेखा कर देते हैं स्वीकार किए जाने वाले किसी भी टाइप से मेल नहीं खाता.

  • रिच कॉन्टेंट से टेक्स्ट की जगह पर कोई असर नहीं पड़ता और न ही उस पर कोई असर पड़ता है कर्सर. कॉन्टेंट पर काम करते समय एडिटर, कर्सर की पोज़िशन को अनदेखा कर सकते हैं.

  • एडिटर के OnCommitContentListener.onCommitContent() तरीका है, तो true को एसिंक्रोनस रूप से लौटाया जा सकता है. यहां तक कि को लोड करने से पहले.

  • टेक्स्ट के उलट, जिसे भरोसेमंद होने से पहले IME में बदलाव किया जा सकता है कॉन्टेंट पर तुरंत कार्रवाई की जाती है. अगर आपको उपयोगकर्ताओं को बदलाव करने या मिटाने की अनुमति देनी है कॉन्टेंट बनाने के लिए, लॉजिक को खुद लागू करें.

अपने ऐप्लिकेशन की जांच करने के लिए, पक्का करें कि आपके डिवाइस या एम्युलेटर में ऐसा कीबोर्ड हो जो रिच कॉन्टेंट. Android 7.1 या इसके बाद के वर्शन में Google कीबोर्ड का इस्तेमाल किया जा सकता है.

IME में इमेज सपोर्ट जोड़ें

जो IME ऐप्लिकेशन में रिच कॉन्टेंट भेजना चाहते हैं उन्हें तय कॉन्टेंट के लिए ज़रूरी शर्तें पूरी करनी होंगी API (एपीआई), जैसा कि इस उदाहरण में दिखाया गया है:

  • सेटिंग में एडमिन के किए गए बदलाव onStartInput() या onStartInputView() और टारगेट में इस्तेमाल किए जा सकने वाले कॉन्टेंट टाइप की सूची पढ़ें Editor. नीचे दिया गया कोड स्निपेट यह जानने का तरीका बताता है कि टारगेट एडिटर, GIF इमेज स्वीकार कर सकता है.

Kotlin

override fun onStartInputView(editorInfo: EditorInfo, restarting: Boolean) {
    val mimeTypes: Array<String> = EditorInfoCompat.getContentMimeTypes(editorInfo)

    val gifSupported: Boolean = mimeTypes.any {
        ClipDescription.compareMimeTypes(it, "image/gif")
    }

    if (gifSupported) {
        // The target editor supports GIFs. Enable the corresponding content.
    } else {
        // The target editor doesn't support GIFs. Disable the corresponding
        // content.
    }
}

Java

@Override
public void onStartInputView(EditorInfo info, boolean restarting) {
    String[] mimeTypes = EditorInfoCompat.getContentMimeTypes(editorInfo);

    boolean gifSupported = false;
    for (String mimeType : mimeTypes) {
        if (ClipDescription.compareMimeTypes(mimeType, "image/gif")) {
            gifSupported = true;
        }
    }

    if (gifSupported) {
        // The target editor supports GIFs. Enable the corresponding content.
    } else {
        // The target editor doesn't support GIFs. Disable the corresponding
        // content.
    }
}
  • जब उपयोगकर्ता कोई इमेज चुनें, तब ऐप्लिकेशन में कॉन्टेंट के बारे में बताना. कॉल करने से बचें commitContent(), जब कोई टेक्स्ट लिखा जा रहा हो, क्योंकि यह इससे एडिटर का फ़ोकस हट सकता है. नीचे दिया गया कोड स्निपेट दिखाता है कि करने के लिए डिज़ाइन किया जा सकता है.

Kotlin

// Commits a GIF image.

// @param contentUri = Content URI of the GIF image to be sent.
// @param imageDescription = Description of the GIF image to be sent.

fun commitGifImage(contentUri: Uri, imageDescription: String) {
    val inputContentInfo = InputContentInfoCompat(
            contentUri,
            ClipDescription(imageDescription, arrayOf("image/gif")),
            null
    )
    val inputConnection = currentInputConnection
    val editorInfo = currentInputEditorInfo
    var flags = 0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        flags = flags or InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION
    }
    InputConnectionCompat.commitContent(inputConnection, editorInfo, inputContentInfo, flags, null)
}

Java

// Commits a GIF image.

// @param contentUri = Content URI of the GIF image to be sent.
// @param imageDescription = Description of the GIF image to be sent.

public static void commitGifImage(Uri contentUri, String imageDescription) {
    InputContentInfoCompat inputContentInfo = new InputContentInfoCompat(
            contentUri,
            new ClipDescription(imageDescription, new String[]{"image/gif"}),
            null
    );
    InputConnection inputConnection = getCurrentInputConnection();
    EditorInfo editorInfo = getCurrentInputEditorInfo();
    Int flags = 0;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        flags |= InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
    }
    InputConnectionCompat.commitContent(
            inputConnection, editorInfo, inputContentInfo, flags, null);
}

एक IME लेखक के रूप में, आपको सबसे अधिक संभावना है कि कॉन्टेंट यूआरआई के अनुरोधों का जवाब दें. हालांकि, अगर आपके IME में कॉन्टेंट काम करता है, तो यह ज़रूरी नहीं है मौजूदा कॉन्टेंट देने वालों से मिलने वाले रेवेन्यू, जैसे कि MediaStore. इस पर जानकारी के लिए तो आपको यह सुझाव दिया जा सकता है कि कॉन्टेंट उपलब्ध कराने वालों के लिए, provider और file provider दस्तावेज़ सबमिट करें.

अगर आपको अपना कॉन्टेंट उपलब्ध कराना है, तो हमारा सुझाव है कि आप इसे एक्सपोर्ट न करें सेट करके android:exported से false. इसके बजाय, सेवा देने वाली कंपनी में अनुमति देने की सेटिंग चालू करें android:grantUriPermission true तक. इसके बाद, आपका IME कॉन्टेंट यूआरआई को ऐक्सेस करने की अनुमतियां दे सकता है, जब कॉन्टेंट भरोसेमंद कॉन्टेंट बनाने के लिए प्रतिबद्ध है. ऐसा करने के दो तरीके हैं:

  • Android 7.1 (एपीआई लेवल 25) और उसके बाद के वर्शन पर, commitContent() को कॉल करते समय, फ़्लैग पैरामीटर को इस पर सेट करें INPUT_CONTENT_GRANT_READ_URI_PERMISSION. इसके बाद, ऐप्लिकेशन को मिलने वाला InputContentInfo ऑब्जेक्ट, अनुरोध कर सकता है और कॉल करके, पढ़ने की अस्थायी अनुमतियां वापस लें requestPermission() और releasePermission().

  • Android 7.0 (एपीआई लेवल 24) और इससे पहले के वर्शन पर, INPUT_CONTENT_GRANT_READ_URI_PERMISSION को अनदेखा किया गया है. इसलिए, मैन्युअल तरीके से अनुमति दें अनुमति नहीं है. ऐसा करने का एक तरीका यह है कि grantUriPermission() पर सेट किया जा सकता है, लेकिन अपने हिसाब से यह तरीका लागू किया जा सकता है वह आपकी ज़रूरतों को पूरा करता हो.

अपने IME की जांच करने के लिए, पक्का करें कि आपके डिवाइस या एम्युलेटर में ऐसा ऐप्लिकेशन हो जो रिच कॉन्टेंट. आप Android 7.1 या इसके बाद वाले वर्शन में Google Messenger ऐप्लिकेशन का इस्तेमाल कर सकते हैं.