ইমেজ কীবোর্ড সমর্থন

ব্যবহারকারীরা প্রায়ই ইমোজি, স্টিকার এবং অন্যান্য ধরণের সমৃদ্ধ সামগ্রী ব্যবহার করে যোগাযোগ করতে চান। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে, সফ্ট কীবোর্ডগুলি- যা ইনপুট মেথড এডিটর নামেও পরিচিত, বা আইএমই-গুলি অ্যাপগুলিতে শুধুমাত্র ইউনিকোড ইমোজি পাঠাতে পারে৷ সমৃদ্ধ বিষয়বস্তুর জন্য, অ্যাপগুলি অ্যাপ-নির্দিষ্ট API তৈরি করে যা অন্য অ্যাপে ব্যবহার করা যায় না বা সহজ শেয়ার অ্যাকশন বা ক্লিপবোর্ডের মাধ্যমে ছবি পাঠানোর মতো সমাধান ব্যবহার করা যায় না।

একটি চিত্র একটি কীবোর্ড দেখাচ্ছে যা চিত্র অনুসন্ধান সমর্থন করে
চিত্র 1. চিত্র কীবোর্ড সমর্থনের উদাহরণ।

অ্যান্ড্রয়েড 7.1 (এপিআই লেভেল 25) দিয়ে শুরু করে, অ্যান্ড্রয়েড SDK-এ কমিট কন্টেন্ট API অন্তর্ভুক্ত রয়েছে, যা IME-এর জন্য একটি অ্যাপের টেক্সট এডিটরে সরাসরি ছবি এবং অন্যান্য সমৃদ্ধ বিষয়বস্তু পাঠানোর একটি সার্বজনীন উপায় প্রদান করে। এপিআই সংশোধন 25.0.0 অনুযায়ী v13 সাপোর্ট লাইব্রেরিতেও উপলব্ধ। আমরা সমর্থন লাইব্রেরি ব্যবহার করার পরামর্শ দিই কারণ এতে সহায়ক পদ্ধতি রয়েছে যা বাস্তবায়নকে সহজ করে।

এই API-এর সাহায্যে, আপনি মেসেজিং অ্যাপ তৈরি করতে পারেন যা যেকোন কীবোর্ড থেকে সমৃদ্ধ সামগ্রী গ্রহণ করে সেইসাথে কীবোর্ডগুলি যে কোনও অ্যাপে সমৃদ্ধ সামগ্রী পাঠাতে পারে। Google কীবোর্ড এবং Google এর বার্তাগুলির মতো অ্যাপগুলি Android 7.1-এ কমিট কন্টেন্ট API সমর্থন করে, যেমন চিত্র 1-এ দেখানো হয়েছে।

এই ডকুমেন্টটি দেখায় কিভাবে IME এবং অ্যাপ উভয় ক্ষেত্রে কমিট কন্টেন্ট API প্রয়োগ করতে হয়।

এটা কিভাবে কাজ করে

কীবোর্ড ইমেজ সন্নিবেশের জন্য IME এবং অ্যাপের অংশগ্রহণ প্রয়োজন। নিম্নলিখিত ক্রমটি চিত্র সন্নিবেশ প্রক্রিয়ার প্রতিটি ধাপকে বর্ণনা করে:

  1. যখন ব্যবহারকারী একটি EditText ট্যাপ করে, তখন সম্পাদক MIME বিষয়বস্তুর প্রকারের একটি তালিকা পাঠায় যা এটি EditorInfo.contentMimeTypes এ গ্রহণ করে।

  2. IME সমর্থিত প্রকারের তালিকা পড়ে এবং সফট কীবোর্ডে বিষয়বস্তু প্রদর্শন করে যা সম্পাদক গ্রহণ করতে পারে।

  3. ব্যবহারকারী যখন একটি ছবি নির্বাচন করেন, তখন IME commitContent() কল করে এবং সম্পাদককে একটি InputContentInfo পাঠায়। commitContent() কলটি commitText() কলের সাথে সাদৃশ্যপূর্ণ, তবে সমৃদ্ধ সামগ্রীর জন্য। InputContentInfo একটি URI থাকে যা একটি বিষয়বস্তু প্রদানকারীর সামগ্রী সনাক্ত করে।

এই প্রক্রিয়া চিত্র 2 এ চিত্রিত করা হয়েছে:

অ্যাপ্লিকেশান থেকে আইএমই এবং অ্যাপ্লিকেশানে ফিরে যাওয়ার ক্রম দেখানো একটি চিত্র৷
চিত্র 2. অ্যাপ্লিকেশন প্রবাহ থেকে IME-তে আবেদন।

অ্যাপগুলিতে ইমেজ সমর্থন যোগ করুন

IMEs থেকে সমৃদ্ধ বিষয়বস্তু গ্রহণ করার জন্য, একটি অ্যাপকে অবশ্যই IME-কে জানাতে হবে যে এটি কোন ধরনের সামগ্রী গ্রহণ করে এবং একটি কলব্যাক পদ্ধতি নির্দিষ্ট করে যা কন্টেন্ট প্রাপ্ত হওয়ার সময় কার্যকর করা হয়। নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি EditText তৈরি করতে হয় যা PNG ছবি গ্রহণ করে:

কোটলিন

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
    }
}

জাভা

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.view.inputmethod এর পরিবর্তে android.support.v13.view.inputmethod এর কিছু উল্লেখ রয়েছে।

  • এই উদাহরণটি একটি EditText তৈরি করে এবং InputConnection পরিবর্তন করতে এর onCreateInputConnection(EditorInfo) পদ্ধতিকে ওভাররাইড করে। InputConnection হল একটি আইএমই এবং অ্যাপের মধ্যে যোগাযোগের চ্যানেল যা এটির ইনপুট গ্রহণ করছে।

  • কল super.onCreateInputConnection() অন্তর্নির্মিত আচরণ সংরক্ষণ করে—পাঠ্য পাঠানো এবং গ্রহণ করা—এবং আপনাকে InputConnection এর একটি রেফারেন্স দেয়।

  • setContentMimeTypes() EditorInfo এ সমর্থিত MIME প্রকারের একটি তালিকা যোগ করে। setContentMimeTypes() এর আগে super.onCreateInputConnection() কে কল করুন।

  • যখনই IME কন্টেন্ট কমিট করে তখন callback করা হয়। onCommitContent() পদ্ধতিতে InputContentInfoCompat এর একটি রেফারেন্স রয়েছে, যাতে একটি বিষয়বস্তু URI রয়েছে।

    • আপনার অ্যাপ যদি এপিআই লেভেল 25 বা তার উপরে চলমান থাকে এবং IME দ্বারা INPUT_CONTENT_GRANT_READ_URI_PERMISSION ফ্ল্যাগ সেট করা থাকে তাহলে অনুমতির অনুরোধ করুন এবং প্রকাশ করুন৷ অন্যথায়, আপনার ইতিমধ্যেই সামগ্রী URI-তে অ্যাক্সেস রয়েছে কারণ এটি IME দ্বারা মঞ্জুর করা হয়েছে বা সামগ্রী প্রদানকারী অ্যাক্সেস সীমাবদ্ধ করে না। আরও তথ্যের জন্য, IMEs-এ ইমেজ সমর্থন যোগ করুন দেখুন।
  • createWrapper() InputConnection , পরিবর্তিত EditorInfo এবং কলব্যাককে একটি নতুন InputConnection এ মুড়ে দেয় এবং ফেরত দেয়।

নিম্নলিখিতগুলি সুপারিশ করা হয়:

  • যে সম্পাদকরা সমৃদ্ধ বিষয়বস্তু সমর্থন করে না তারা setContentMimeTypes() কল করে না এবং তারা তাদের EditorInfo.contentMimeTypes null এ সেট করে রাখে।

  • যদি InputContentInfo তে নির্দিষ্ট করা MIME প্রকারটি তাদের গ্রহণ করা কোনো প্রকারের সাথে মেলে না তাহলে সম্পাদকরা বিষয়বস্তুটিকে উপেক্ষা করেন।

  • সমৃদ্ধ বিষয়বস্তু পাঠ্য কার্সারের অবস্থান দ্বারা প্রভাবিত হয় না এবং প্রভাবিত হয় না। বিষয়বস্তুর সাথে কাজ করার সময় সম্পাদকরা কার্সার অবস্থান উপেক্ষা করতে পারেন।

  • সম্পাদকের OnCommitContentListener.onCommitContent() পদ্ধতিতে, আপনি বিষয়বস্তু লোড করার আগেও true অ্যাসিঙ্ক্রোনাসভাবে ফিরে আসতে পারেন।

  • পাঠ্যের বিপরীতে, যা প্রতিশ্রুতিবদ্ধ হওয়ার আগে IME-এ সম্পাদনা করা যেতে পারে, সমৃদ্ধ সামগ্রী অবিলম্বে প্রতিশ্রুতিবদ্ধ হয়। আপনি যদি ব্যবহারকারীদের বিষয়বস্তু সম্পাদনা বা মুছতে দিতে চান, তাহলে যুক্তিটি নিজেই প্রয়োগ করুন।

আপনার অ্যাপ পরীক্ষা করতে, নিশ্চিত করুন যে আপনার ডিভাইস বা এমুলেটরে একটি কীবোর্ড আছে যা সমৃদ্ধ সামগ্রী পাঠাতে পারে। আপনি Android 7.1 বা উচ্চতর সংস্করণে Google কীবোর্ড ব্যবহার করতে পারেন।

IMEs-এ ছবি সমর্থন যোগ করুন

যে আইএমইগুলি অ্যাপগুলিতে সমৃদ্ধ সামগ্রী পাঠাতে চায় তাদের অবশ্যই কমিট সামগ্রী API প্রয়োগ করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

  • onStartInput() বা onStartInputView() ওভাররাইড করুন এবং টার্গেট এডিটর থেকে সমর্থিত বিষয়বস্তুর প্রকারের তালিকা পড়ুন। নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে লক্ষ্য সম্পাদক GIF ছবি গ্রহণ করে কিনা তা পরীক্ষা করবেন।

কোটলিন

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.
    }
}

জাভা

@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() কল করা এড়িয়ে চলুন, কারণ এটি সম্পাদকের ফোকাস হারাতে পারে। নিচের কোড স্নিপেটটি দেখায় কিভাবে একটি GIF ইমেজ করতে হয়।

কোটলিন

// 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)
}

জাভা

// 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 লেখক হিসাবে, আপনাকে সম্ভবত আপনার নিজস্ব সামগ্রী প্রদানকারীকে কন্টেন্ট URI অনুরোধে সাড়া দিতে হবে। ব্যতিক্রম হল যদি আপনার IME MediaStore মত বিদ্যমান সামগ্রী প্রদানকারীর সামগ্রী সমর্থন করে। বিষয়বস্তু প্রদানকারী নির্মাণের তথ্যের জন্য, বিষয়বস্তু প্রদানকারী এবং ফাইল প্রদানকারীর ডকুমেন্টেশন দেখুন।

আপনি যদি নিজের সামগ্রী প্রদানকারী তৈরি করেন, তাহলে আমরা আপনাকে android:exported to false সেট করে এটি রপ্তানি না করার পরামর্শ দিচ্ছি। পরিবর্তে, android:grantUriPermission কে true এ সেট করে প্রদানকারীর অনুমতি প্রদান সক্ষম করুন। তারপর, আপনার আইএমই বিষয়বস্তু URI অ্যাক্সেস করার অনুমতি দিতে পারে যখন বিষয়বস্তু প্রতিশ্রুতিবদ্ধ হয়। এটি করার দুটি উপায় আছে:

  • Android 7.1 (API লেভেল 25) এবং উচ্চতর তে, commitContent() কল করার সময়, ফ্ল্যাগ প্যারামিটারটিকে INPUT_CONTENT_GRANT_READ_URI_PERMISSION এ সেট করুন। তারপরে, অ্যাপটি যে InputContentInfo অবজেক্টটি গ্রহণ করে তা requestPermission() এবং releasePermission() এ কল করে অস্থায়ী পাঠের অনুমতির অনুরোধ করতে এবং প্রকাশ করতে পারে।

  • Android 7.0 (API লেভেল 24) এবং তার নিচের, INPUT_CONTENT_GRANT_READ_URI_PERMISSION উপেক্ষা করা হয়, তাই ম্যানুয়ালি কন্টেন্টের অনুমতি দিন। এটি করার একটি উপায় হল grantUriPermission() এর সাথে, তবে আপনি আপনার নিজস্ব প্রক্রিয়াটি বাস্তবায়ন করতে পারেন যা আপনার নিজের প্রয়োজনীয়তাগুলিকে সন্তুষ্ট করে।

আপনার IME পরীক্ষা করতে, নিশ্চিত করুন যে আপনার ডিভাইস বা এমুলেটরে এমন একটি অ্যাপ আছে যা সমৃদ্ধ সামগ্রী পেতে পারে। আপনি Android 7.1 বা উচ্চতর সংস্করণে Google Messenger অ্যাপ ব্যবহার করতে পারেন।