إتاحة الرموز التعبيرية الحديثة

يتم تحديث المجموعة العادية من الرموز التعبيرية سنويًا من خلال Unicode نظرًا لتزايد استخدام الرموز التعبيرية بسرعة لجميع أنواع التطبيقات.

إذا كان تطبيقك يعرض محتوى على الإنترنت أو يوفر إدخال نص، ننصحك بشدة بتوفير أحدث خطوط الرموز التعبيرية. وإلا، قد يتم عرض الرموز التعبيرية اللاحقة على شكل مربّع مربّع صغير يُسمى tofu (☐) أو تسلسلات رموز تعبيرية أخرى يتم عرضها بشكل غير صحيح.

ولا يمكن للإصدارات 11 من Android (المستوى 30 لواجهة برمجة التطبيقات) والإصدارات الأقدم تعديل خط الرموز التعبيرية، لذا يجب تعديل خط الرموز التعبيرية يدويًا على التطبيقات التي تعرضها على هذه الإصدارات.

في ما يلي أمثلة على الرموز التعبيرية الحديثة.

أمثلة الإصدار
🫠 🫱🏼 🫲🏿 🫰🏽 14.0 (أيلول/سبتمبر 2021)
⬅ 🌫️ 🧔─ ♀️ 🧑🏿 ❤️ 🧑🏾 13.1 (أيلول/سبتمبر 2020)
🥲 🥷🏿 🐻 َع️ 13.0 (آذار/مارس 2020)
🧑 🦰 🧑🏿 🦯 شاركونا 🤝 ・🏼 12.1 (تشرين الأول/أكتوبر 2019)
🦩 🦻🏿 لإضافة🏼 🤝 التقويم 12.0 (شباط/ فبراير 2019)

توفّر مكتبة androidx.emoji2:emoji2 توافقًا أبسط مع الأنظمة القديمة مع الإصدارات الأقدم من Android. إنّ مكتبة emoji2 هي مكتبة تابعة لمكتبة AppCompat ولا تتطلب أي إعدادات أخرى لتعمل.

إتاحة الرموز التعبيرية في Compose

BOM آذار (مارس) 2023 (الإصدار 1.4 من واجهة المستخدم Compose) يوفّر الدعم لأحدث إصدار من الرموز التعبيرية، بما في ذلك التوافق مع الأنظمة القديمة مع إصدارات Android القديمة وصولاً إلى واجهة برمجة التطبيقات 21. تتناول هذه الصفحة كيفية ضبط الرموز التعبيرية الحديثة في نظام العرض. راجِع صفحة الرموز التعبيرية في Compose للاطّلاع على مزيد من المعلومات.

المتطلّبات الأساسية

للتأكّد من أنّ تطبيقك يعرض الرموز التعبيرية الأحدث بشكل صحيح، عليك تشغيله على جهاز يعمل بالإصدار 10 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) أو بإصدار أقدم. تتضمن هذه الصفحة رموزًا تعبيرية حديثة يمكنك عرضها للاختبار.

استخدام AppCompat لإتاحة أحدث الرموز التعبيرية

يتضمّن الإصدار AppCompat 1.4 إمكانية استخدام الرموز التعبيرية.

لاستخدام AppCompat من أجل إتاحة الرموز التعبيرية، عليك اتّباع الخطوات التالية:

  1. تأكد من أن الوحدة تعتمد على إصدار مكتبة AppCompat 1.4.0-alpha01 أو الإصدارات الأحدث.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. احرص على أن تعمل جميع الأنشطة التي تعرض نصًا على امتداد الصف AppCompatActivity.

    Kotlin

    MyActivity.kt
    
    class MyActivity: AppCompatActivity {
    ...
    }
    

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
    
  3. اختبِر عملية الدمج من خلال تشغيل تطبيقك على جهاز يعمل بنظام التشغيل Android 10 أو بإصدار أقدم مع عرض سلسلة الاختبار التالية. تأكد من عرض جميع الأحرف بشكل صحيح.

    • 14.0: 🫠 و🫱🏼 🫲🏿 و🫰🏽
    • 13.1: 🧠 🌫️ و🧔─ ♀️ و🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲، 🥷🏿، 🐻 تنسيق️
    • 12.1: 🧑 🦰، 🧑🏿 🦯، مفيدة 🤝 🏼
    • 12.0: 🦩، 🦻🏿، Spreadsheet🏼 🤝 🌴

يعرض تطبيقك تلقائيًا الرموز التعبيرية المتوافقة مع الأنظمة القديمة على جميع الأجهزة التي توفّر موفِّر خطوط قابل للتنزيل ومتوافق مع emoji2، مثل الأجهزة المستندة إلى خدمات Google Play.

إذا كان تطبيقك يستخدم AppCompat ولكنه يعرض التوفو (☐)

في بعض الحالات، قد يعرض تطبيقك التوفو بدلاً من الرموز التعبيرية المناسبة، حتى إذا أضفت مكتبة AppCompat. فيما يلي تفسيرات وحلول محتملة.

تشغيل التطبيق على جهاز يضيء مؤخرًا أو على محاكي جديد

يمكنك محو بيانات خدمات Google Play الخاصة بالتطبيق لمحو أي تخزين مؤقت للخطوط قد يحدث أثناء بدء التشغيل. يؤدي ذلك عادةً إلى حلّ المشكلة بعد بضع ساعات.

لمسح بيانات التطبيق، قم بما يلي:

  1. افتح الإعدادات على جهازك الذي يعمل بنظام التشغيل Android.

  2. انقر على التطبيقات والإشعارات.

  3. انقر على عرض كل التطبيقات أو معلومات التطبيق.

  4. تنقَّل بين التطبيقات وانقر على خدمات Google Play.

  5. انقر على مساحة التخزين وذاكرة التخزين المؤقت.

  6. انقر على محو ذاكرة التخزين المؤقت.

لا يستخدم تطبيقك صفًا مرتبطًا بنص AppCompat.

وقد يحدث ذلك في حال عدم تمديد AppCompatActivity أو إنشاء مثيل لطريقة العرض في رمز برمجي، مثل TextView. تحقَّق مما يلي:

تضخم AppCompatActivity تلقائيًا قيمة AppCompatTextView بدلاً من TextView عند تضخيم XML، لذلك لن تحتاج إلى تعديل ملف XML.

لا يتوافق الهاتف التجريبي مع الخطوط القابلة للتنزيل.

تحقَّق من أن DefaultEmojiCompatConfig.create تعرض إعدادات غير فارغة.

لم يقم المحاكي على مستوى واجهة برمجة التطبيقات السابق بترقية "خدمات Google Play"

عند استخدام محاكي على مستوى سابق لواجهة برمجة التطبيقات، قد تحتاج إلى تحديث "خدمات Google Play" المُجمَّعة لـ emoji2 للعثور على موفّر الخطوط. للقيام بذلك، سجّل الدخول إلى متجر Google Play على المحاكي.

للتحقق من تثبيت إصدار متوافق، يمكنك إجراء ما يلي:

  1. نفِّذ الأمر التالي:

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. تحقَّق من أنّ قيمة versionCode هي أعلى من 211200000.

إتاحة الرموز التعبيرية بدون AppCompat

إذا لم يتمكّن تطبيقك من تضمين AppCompat، يمكن أن يستخدم emoji2 مباشرةً. يتطلب ذلك مزيدًا من العمل، لذا لا تستخدم هذه الطريقة إلا إذا كان بإمكان تطبيقك استخدام AppCompat.

لإتاحة الرموز التعبيرية بدون مكتبة AppCompat، عليك اتّباع الخطوات التالية:

  1. في ملف build.gradle الخاص بتطبيقك، ضمِّن emoji2 وemoji2-views.

    build.gradle
    
    def emojiVersion = "1.0.0-alpha03"
    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-views:$emojiVersion"
    

    توفّر وحدة emoji2-views فئات فرعية من TextView وButton وEditText تنفّذ EmojiCompat. ولا تستخدمها في تطبيق يتضمن AppCompat، لأنه ينفّذ EmojiCompat.

  2. في ملف XML والرمز البرمجي، في أي مكان تستخدم فيه TextView أو EditText أو Button، يمكنك استخدام EmojiTextView أو EmojiEditText أو EmojiButton بدلاً من ذلك.

    activity_main.xml
    
    <androidx.emoji2.widget.EmojiTextView ... />
    <androidx.emoji2.widget.EmojiEditText ... />
    <androidx.emoji2.widget.EmojiButton ... />
    

    من خلال تضمين الوحدة emoji2، يستخدم النظام موفِّر الخطوط التلقائي القابل للتنزيل لتحميل خط الرموز التعبيرية تلقائيًا بعد فترة وجيزة من بدء تشغيل التطبيق. ليست هناك حاجة لمزيد من التكوين.

  3. لاختبار عملية الدمج، شغِّل تطبيقك على جهاز يعمل بنظام التشغيل Android 11 أو بإصدار أقدم مع عرض سلاسل الاختبار التالية. تأكد من عرض جميع الأحرف بشكل صحيح.

    • 14.0: 🫠 و🫱🏼 🫲🏿 و🫰🏽
    • 13.1: 🧠 🌫️ و🧔─ ♀️ و🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲، 🥷🏿، 🐻 تنسيق️
    • 12.1: 🧑 🦰، 🧑🏿 🦯، مفيدة 🤝 🏼
    • 12.0: 🦩، 🦻🏿، Spreadsheet🏼 🤝 🌴

استخدام EmojiCompat بدون تطبيقات مصغّرة

تستخدم ميزة "EmojiCompat" السمة EmojiSpan لعرض الصور الصحيحة. بالتالي، يجب تحويل أي عنصر CharSequence محدّد إلى كائن Spanned مع EmojiSpan كائنات. توفّر فئة EmojiCompat الطريقة process() لتحويل CharSequences إلى Spanned مثيل. باستخدام هذه الطريقة، يمكنك استدعاء process() في الخلفية وتخزين النتائج مؤقتًا، مما يحسن أداء تطبيقك.

Kotlin

val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")

Java

CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");

استخدام EmojiCompat لتعديل أسلوب الإدخال

تتيح الفئة EmojiCompat للوحات المفاتيح عرض الرموز التعبيرية المتوافقة مع التطبيق الذي يتم التفاعل معه. أدوات تحرير أسلوب الإدخال (IMEs) يمكنها استخدام الإجراء getEmojiMatch() للتحقق مما إذا كان مثيل EmojiCompat قادرًا على عرض رمز تعبيري. تستخدم هذه الطريقة CharSequence من الرمز التعبيري وتعرض true إذا كان بإمكان EmojiCompat رصد الرمز التعبيري وعرضه.

يمكن للوحة المفاتيح أيضًا التحقّق من إصدار EmojiCompat المتوافق مع التطبيق لتحديد الرموز التعبيرية التي سيتم عرضها في لوحة الألوان. لمعرفة الإصدار، إذا كان ذلك متاحًا، يمكن للوحة المفاتيح البحث عن المفاتيح التالية في حزمة EditorInfo.extras:

  • EDITOR_INFO_METAVERSION_KEY: تمثل نسخة البيانات الوصفية للرموز التعبيرية التي يستخدمها التطبيق. في حال عدم توفّر هذا المفتاح، هذا يعني أنّ التطبيق لا يستخدم EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: إذا كان المفتاح متوفّرًا وتم ضبطه على true، سيضبط التطبيق رمز EmojiCompat لاستبدال كل الرموز التعبيرية، حتى إذا كانت متوفّرة في النظام.

يمكنك الاطّلاع على مزيد من المعلومات حول كيفية ضبط مثيل من EmojiCompat.

استخدام الرموز التعبيرية في طرق العرض المخصّصة

إذا كان تطبيقك يتضمّن طرق عرض مخصّصة تمثّل فئات فرعية مباشرة أو غير مباشرة من TextView، مثل Button أو Switch أو EditText، وكان بإمكان هذه الملفات الشخصية عرض محتوى من إنشاء المستخدمين، يجب أن ينفِّذ كل منها EmojiCompat.

تختلف هذه العملية حسب ما إذا كان تطبيقك يستخدم مكتبة AppCompat.

إضافة طرق عرض مخصّصة للتطبيقات باستخدام AppCompat

إذا كان تطبيقك يستخدم AppCompat، يمكنك تمديد تنفيذ AppCompat بدلاً من تنفيذ النظام الأساسي. يمكنك استخدام الجدول التالي كدليل لكيفية زيادة عدد المشاهدات في AppCompat:

بدلاً من توسيع نطاق... تمديد
TextView AppCompatTextView
EditText AppCompatEditText
ToggleButton AppCompatToggleButton
Switch SwitchCompat
Button AppCompatButton
CheckedTextView AppCompatCheckedTextView
RadioButton AppCompatRadioButton
CheckBox AppCompatCheckBox
AutoCompleteTextView AppCompatAutoCompleteTextView
MultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView

إضافة طرق عرض مخصّصة للتطبيقات التي لا تحتوي على AppCompat

إذا كان تطبيقك لا يستخدم السمة AppCompat، استخدِم الأدوات المساعدة لدمج طريقة العرض في وحدة emoji2-views-helper المصمَّمة للاستخدام في طرق العرض المخصّصة. هذه هي أدوات المساعدة التي تستخدمها مكتبة AppCompat لإتاحة الرموز التعبيرية.

أكمِل الخطوات التالية لإتاحة طرق العرض المخصّصة للتطبيقات التي لا تستخدم AppCompat.

  1. إضافة مكتبة "emoji2-views-helper":

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. اتّبِع التعليمات لتضمين EmojiTextViewHelper أو EmojiEditTextHelper في طرق العرض المخصّصة لتطبيقك.

  3. اختبِر عملية الدمج من خلال تشغيل تطبيقك على جهاز يعمل بنظام التشغيل Android 10 أو بإصدار أقدم مع عرض سلسلة الاختبار التالية. تأكد من عرض جميع الأحرف بشكل صحيح.

    • 14.0: 🫠 و🫱🏼 🫲🏿 و🫰🏽
    • 13.1: 🧠 🌫️ و🧔─ ♀️ و🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲، 🥷🏿، 🐻 تنسيق️
    • 12.1: 🧑 🦰، 🧑🏿 🦯، مفيدة 🤝 🏼
    • 12.0: 🦩، 🦻🏿، Spreadsheet🏼 🤝 🌴

الميزات الاختيارية للتعامل مع الرمز التعبيري 2

بعد تضمين مكتبة emoji2 في تطبيقك، يمكنك إضافة الميزات الاختيارية الموضّحة في هذا القسم.

ضبط الرموز التعبيرية 2 لاستخدام خط مختلف أو موفّر خطوط قابل للتنزيل

لإعداد emoji2 على استخدام خط مختلف أو موفِّر خطوط قابل للتنزيل، عليك اتّباع ما يلي:

  1. أوقِف EmojiCompatInitializer من خلال إضافة ما يلي إلى ملف البيان:

    <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer"
               tools:node="remove" />
    </provider>
  2. نفّذ أيًا مما يلي:

    • استخدِم الإعدادات التلقائية من خلال طلب الرمز DefaultEmojiCompatConfiguration.create(context).

    • يمكنك إنشاء إعداداتك الخاصة لتحميل الخطوط من مصدر آخر باستخدام EmojiCompat.Config. توفِّر هذه الفئة خيارات متعددة لتعديل سلوك EmojiCompat كما هو موضّح في القسم التالي.

تعديل سلوك EmojiCompat

يمكنك استخدام مثيل EmojiCompat.Config لتعديل سلوك EmojiCompat.

أهم خيار ضبط هو setMetadataLoadStrategy()، الذي يتحكم في وقت تحميل EmojiCompat للخط. يبدأ تحميل الخط فور استدعاء EmojiCompat.load()، ويؤدي هذا إلى تشغيل أي عمليات تنزيل لازمة. ينشئ النظام سلسلة محادثات لتنزيل الخطوط ما لم يوفر تطبيقك سلسلة.

يتيح لك LOAD_STRATEGY_MANUAL التحكّم في وقت استدعاء EmojiCompat.load()، كما أنّ LOAD_STRATEGY_DEFAULT يجعل بدء التحميل بشكل متزامن في المكالمة إلى EmojiCompat.init().

تستخدم معظم التطبيقات السمة LOAD_STRATEGY_MANUAL للتحكّم في سلسلة التعليمات وتوقيت تحميل الخط. يجب على التطبيق تأجيل النظر إلى ما بعد ظهور الشاشة الأولى لتجنب تقديم وقت استجابة بدء التشغيل. يتّبع EmojiCompatInitializer هذه الممارسة ويؤجِّل تحميل خط الرموز التعبيرية إلى أن يتم استئناف تشغيل الشاشة الأولى.

استخدِم الطرق التالية من الفئة الأساسية لتحديد جوانب أخرى من عملية الضبط:

  • setReplaceAll(): يحدد ما إذا كان EmojiCompat سيستبدل جميع الرموز التعبيرية التي يعثر عليها بمثيلات EmojiSpan. بشكل تلقائي، عندما يستنتج EmojiCompat أنّ النظام يمكنه عرض رمز تعبيري، لا يستبدل ذلك الرمز التعبيري. عند ضبط السياسة على true، يتم استبدال كل الرموز التعبيرية بكائنات EmojiSpan.EmojiCompat
  • setEmojiSpanIndicatorEnabled(): تشير إلى ما إذا كان EmojiCompat يستبدل رمزًا تعبيريًا بكائن EmojiSpan. عند ضبط السياسة على true، يرسم EmojiCompat خلفية عن EmojiSpan. تُستخدم هذه الطريقة بشكل أساسي لأغراض تصحيح الأخطاء.
  • setEmojiSpanIndicatorColor: لضبط اللون للإشارة إلى EmojiSpan. ستكون القيمة التلقائية GREEN.
  • registerInitCallback(): إعلام أحد التطبيقات بحالة إعداد EmojiCompat.

إضافة أدوات معالجة الإعداد

توفّر الصفّتان EmojiCompat وEmojiCompat.Config طريقتَي registerInitCallback() وunregisterInitCallback() لتسجيل طلبات معاودة الاتصال بالإعداد وإلغاء تسجيلها. ويستخدم تطبيقك طلبات معاودة الاتصال هذه للانتظار حتى يتم إعداد EmojiCompat قبل معالجة الرموز التعبيرية في سلسلة محادثات في الخلفية أو في عرض مخصّص.

لاستخدام هذه الطرق، أنشئ مثيلاً للفئة EmojiCompat.InitCallback. عليك استدعاء هذه الطرق وتمريرها في مثيل الفئة EmojiCompat.InitCallback. عند نجاح الإعداد، تستدعي الفئة EmojiCompat الطريقة onInitialized(). إذا تعذّر إعداد المكتبة، تستدعي الفئة EmojiCompat الطريقة onFailed().

للتحقّق من حالة الإعداد في أي وقت، يمكنك استدعاء الإجراء getLoadState(). تعرِض هذه الطريقة إحدى القيم التالية: LOAD_STATE_LOADING أو LOAD_STATE_SUCCEEDED أو LOAD_STATE_FAILED.

دعم الخطوط المجمّعة مع الرموز التعبيرية 2

يمكنك استخدام عنصر emoji2-bundled لتجميع خط الرموز التعبيرية في تطبيقك. ومع ذلك، ننصحك بشدة بأن يستخدم تطبيقك خطوطًا قابلة للتنزيل لأن حجم الخط NotoColorEmoji يتجاوز 10 ميغابايت متى أمكن ذلك. إنّ عنصر emoji2-bundled مخصّص للتطبيقات على الأجهزة التي لا تتيح استخدام الخطوط القابلة للتنزيل.

لاستخدام عنصر emoji2-bundled، عليك اتّباع الخطوات التالية:

  1. تضمين emoji2-bundled وemoji2 عنصر:

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. اضبط emoji2 لاستخدام الإعدادات المجمّعة:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))
    

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
    
  3. اختبِر عملية الدمج باتّباع الخطوات السابقة لتضمين emojicompat مع AppCompat أو بدونها. تأكد من عرض سلسلة الاختبار بشكل صحيح.

    • 14.0: 🫠 و🫱🏼 🫲🏿 و🫰🏽
    • 13.1: 🧠 🌫️ و🧔─ ♀️ و🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲، 🥷🏿، 🐻 تنسيق️
    • 12.1: 🧑 🦰، 🧑🏿 🦯، مفيدة 🤝 🏼
    • 12.0: 🦩، 🦻🏿، Spreadsheet🏼 🤝 🌴

تأثير إعدادات EmojiCompat التلقائية

يطبّق النظام الإعدادات التلقائية باستخدام مكتبة بدء التشغيل وEmojiCompatInitializer وDefaultEmojiCompatConfig.

بعد استئناف النشاط الأول في التطبيق، يحدد المُعِدّ موعدًا لتحميل خط الرموز التعبيرية. وتتيح هذه المهلة الموجزة لتطبيقك عرض المحتوى الأولي بدون أي وقت استجابة محتمل بسبب تحميل الخط في سلسلة محادثات في الخلفية.

يبحث DefaultEmojiCompatConfig عن موفِّر خطوط قابل للتنزيل يثبّته النظام وينفّذ واجهة EmojiCompat، مثل خدمات Google Play. في الأجهزة التي تعمل بواسطة "خدمات Google Play"، يؤدي هذا إلى تحميل الخط باستخدام "خدمات Google Play".

ينشئ المهيئ سلسلة محادثات في الخلفية لتحميل خط الرموز التعبيرية، وقد يستغرق تنزيل الخط مدة تصل إلى 10 ثوانٍ قبل انتهاء المهلة. بعد تنزيل الخط، يستغرق الأمر 150 مللي ثانية تقريبًا في سلسلة التعليمات في الخلفية لإعداد EmojiCompat.

يمكنك تأجيل إعداد EmojiCompat، حتى إذا أوقفت EmojiCompatInitializer. في حال ضبط EmojiCompat يدويًا، يمكنك الاتصال بـ EmojiCompat.load() بعد أن يتم عرض الشاشة الأولى من تطبيقك لتجنُّب تزايد الطلب في الخلفية مع تحميل الشاشة الأولى.

بعد التحميل، يستخدم EmojiCompat حوالي 300 كيلوبايت من ذاكرة الوصول العشوائي للاحتفاظ بالبيانات الوصفية للرموز التعبيرية.