Поддержка современных эмодзи

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как поддерживать эмодзи в Compose.

Стандартный набор эмодзи ежегодно обновляется Unicode, поскольку эмодзи все чаще используются в приложениях всех типов.

Если в вашем приложении есть контент из интернета или поле для ввода текста, мы настоятельно рекомендуем добавить поддержку последних шрифтов эмодзи. В противном случае эмодзи могут отображаться в виде небольшого квадрата, который называется тофу (☐), или других некорректных последовательностей.

В Android 11 (уровень API 30) и более ранних версиях шрифт эмодзи не обновляется, поэтому приложения, в которых он используется, нужно обновлять вручную.

Ниже приведены примеры современных эмодзи.

Примеры Версия
🫩 🪉 🇨🇶 16.0 (сентябрь 2024 г.)
🐦‍🔥 🧑‍🧑‍🧒‍🧒 👩🏽‍🦽‍➡️ 🇲🇶 15.1 (сентябрь 2023 г.)
🩷 🫸🏼 🐦‍⬛ 15.0 (сентябрь 2022 г.)
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0 (сентябрь 2021 г.)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (сентябрь 2020 г.)
🥲 🥷🏿 🐻‍❄️ 13.0 (март 2020 г.)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (октябрь 2019 г.)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (февраль 2019 г.)

Библиотека androidx.emoji2:emoji2 обеспечивает обратную совместимость с более ранними версиями Android. Библиотека emoji2 является зависимостью библиотеки AppCompat и не требует дополнительной настройки.

Поддержка эмодзи в функции "Генератор текстов"

BOM за март 2023 года (Compose UI 1.4) поддерживает последнюю версию эмодзи, включая обратную совместимость с более старыми версиями Android вплоть до API 21. В этой статье рассказывается, как настроить современные эмодзи в системе View. Подробнее об эмодзи в окне создания письма…

Требования

Чтобы убедиться, что новые эмодзи отображаются правильно, запустите приложение на устройстве с Android 10 (уровень API 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 или более ранней версией и покажите следующую тестовую строку. Убедитесь, что все символы отображаются правильно.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Приложение автоматически показывает обратно совместимые эмодзи на всех устройствах, где есть поставщик скачиваемых шрифтов, совместимый с emoji2, например на устройствах с сервисами Google Play.

Если в приложении используется AppCompat, но вместо символов показываются пустые квадраты (☐)

В некоторых случаях в приложении вместо эмодзи могут показываться пустые квадраты, даже если вы добавили библиотеку AppCompat. Ниже приведены возможные причины и решения.

Вы запускаете приложение на устройстве, на котором недавно была установлена новая прошивка, или на новом эмуляторе.

Очистите данные сервисов Google Play, чтобы удалить кеш шрифтов, который мог быть создан при запуске. Обычно это решает проблему в течение нескольких часов.

Чтобы удалить данные приложения, выполните следующие действия:

  1. Откройте Настройки на устройстве Android.

  2. Выберите Приложения и уведомления.

  3. Нажмите Показать все приложения или Сведения о приложениях.

  4. Прокрутите список приложений и выберите Сервисы Google Play.

  5. Нажмите Хранилище и кеш.

  6. Нажмите Очистить кеш.

В вашем приложении не используется класс AppCompat, связанный с текстом.

Это может произойти, если вы не расширите AppCompatActivity или создадите экземпляр представления в коде, например TextView. Эта ошибка возникает в следующих случаях:

  • Серия продлится на AppCompatActivity.
  • Если вы создаете представление в коде, используйте правильный подкласс AppCompat.

AppCompatActivity автоматически заменяет TextView на AppCompatTextView при обработке XML, поэтому вам не нужно обновлять XML-код.

Тестовый телефон не поддерживает скачиваемые шрифты.

Убедитесь, что метод DefaultEmojiCompatConfig.create возвращает ненулевую конфигурацию.

Эмулятор на более раннем уровне API не обновил сервисы Google Play.

Если вы используете эмулятор на более раннем уровне API, вам может потребоваться обновить сервисы 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. Включите emoji2 и emoji2-views в файл build.gradle приложения.

    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 или более ранней версией ОС и посмотрите, показываются ли следующие тестовые строки. Убедитесь, что все символы отображаются правильно.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Как использовать 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 позволяет клавиатурам отображать эмодзи, поддерживаемые приложением, с которым они взаимодействуют. Редакторы методов ввода (IME) могут использовать метод 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 или более ранней версией и покажите следующую тестовую строку. Убедитесь, что все символы отображаются правильно.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Дополнительные функции для работы с emoji2

После того как вы добавите библиотеку emoji2 в приложение, вы сможете включить дополнительные функции, описанные в этом разделе.

Как настроить emoji2 для использования другого шрифта или поставщика скачиваемых шрифтов

Чтобы настроить 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, EmojiCompat заменяет все эмодзи объектами EmojiSpan.
  • 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.

Поддержка встроенных шрифтов с emoji2

Вы можете использовать артефакт 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 или без него. Убедитесь, что тестовая строка отображается правильно.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Влияние автоматической настройки EmojiCompat

Система применяет конфигурацию по умолчанию, используя библиотеку запуска EmojiCompatInitializer и DefaultEmojiCompatConfig.

После возобновления первого действия в приложении инициализатор планирует загрузку шрифта эмодзи. Эта небольшая задержка позволяет приложению отображать исходный контент без каких-либо потенциальных задержек из-за загрузки шрифта в фоновом потоке.

DefaultEmojiCompatConfig ищет установленного в системе поставщика скачиваемых шрифтов, который реализует интерфейс EmojiCompat, например сервисы Google Play. На устройствах с сервисами Google Play шрифт загружается с их помощью.

Инициализатор создает фоновый поток для загрузки шрифта эмодзи. Скачивание шрифта может занять до 10 секунд, после чего время ожидания истекает. После скачивания шрифта инициализация EmojiCompat в фоновом потоке занимает около 150 миллисекунд.

Отложите инициализацию EmojiCompat, даже если вы отключите EmojiCompatInitializer. Если вы настраиваете EmojiCompat вручную, вызовите EmojiCompat.load() после того, как отобразится первый экран приложения. Это позволит избежать конфликта с загрузкой первого экрана.

После загрузки EmojiCompat использует около 300 КБ ОЗУ для хранения метаданных эмодзи.