Стандартный набор эмодзи ежегодно обновляется 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 для поддержки эмодзи, выполните следующие действия:
Убедитесь, что ваш модуль зависит от библиотеки
AppCompatверсии 1.4.0-alpha01 или более поздней.build.gradle // Ensure version is 1.4.0-alpha01 or higher. implementation "androidx.appcompat:appcompat.$appcompatVersion"Убедитесь, что все действия, в которых показывается текст, расширяют класс
AppCompatActivity.Kotlin
MyActivity.kt class MyActivity: AppCompatActivity { ... }
Java
MyActivity.java class MyActivity extends AppCompatActivity { ... }
Чтобы протестировать интеграцию, запустите приложение на устройстве с 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, чтобы удалить кеш шрифтов, который мог быть создан при запуске. Обычно это решает проблему в течение нескольких часов.
Чтобы удалить данные приложения, выполните следующие действия:
Откройте Настройки на устройстве Android.
Выберите Приложения и уведомления.
Нажмите Показать все приложения или Сведения о приложениях.
Прокрутите список приложений и выберите Сервисы Google Play.
Нажмите Хранилище и кеш.
Нажмите Очистить кеш.
В вашем приложении не используется класс AppCompat, связанный с текстом.
Это может произойти, если вы не расширите AppCompatActivity или создадите экземпляр представления в коде, например TextView. Эта ошибка возникает в следующих случаях:
- Серия продлится на
AppCompatActivity. - Если вы создаете представление в коде, используйте правильный подкласс
AppCompat.
AppCompatActivity автоматически заменяет TextView на AppCompatTextView при обработке XML, поэтому вам не нужно обновлять XML-код.
Тестовый телефон не поддерживает скачиваемые шрифты.
Убедитесь, что метод DefaultEmojiCompatConfig.create возвращает ненулевую конфигурацию.
Эмулятор на более раннем уровне API не обновил сервисы Google Play.
Если вы используете эмулятор на более раннем уровне API, вам может потребоваться обновить сервисы Google Play, чтобы emoji2 мог найти поставщика шрифтов. Для этого войдите в Google Play в эмуляторе.
Чтобы проверить, установлена ли совместимая версия, выполните следующие действия:
Выполните следующую команду:
adb shell dumpsys package com.google.android.gms | grep versionУбедитесь, что
versionCodeвыше, чем211200000.
Поддержка эмодзи без AppCompat
Если вы не можете включить в приложение AppCompat, используйте emoji2 напрямую. Это требует больше усилий, поэтому используйте этот метод, только если ваше приложение не может использовать AppCompat.
Чтобы обеспечить поддержку эмодзи без библиотеки AppCompat, выполните следующие действия:
Включите
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.В XML и коде вместо
TextView,EditTextилиButtonиспользуйтеEmojiTextView,EmojiEditTextилиEmojiButton.activity_main.xml <androidx.emoji2.widget.EmojiTextView ... /> <androidx.emoji2.widget.EmojiEditText ... /> <androidx.emoji2.widget.EmojiButton ... />При включении модуля
emoji2система использует поставщика скачиваемых шрифтов по умолчанию, чтобы автоматически загружать шрифт эмодзи вскоре после запуска приложения. Дополнительная настройка не требуется.Чтобы протестировать интеграцию, запустите приложение на устройстве с 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, выполните следующие действия:
Добавьте библиотеку
emoji2-views-helper:implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"Следуйте инструкциям, чтобы добавить
EmojiTextViewHelperилиEmojiEditTextHelperв пользовательские представления приложения.Чтобы протестировать интеграцию, запустите приложение на устройстве с Android 10 или более ранней версией и покажите следующую тестовую строку. Убедитесь, что все символы отображаются правильно.
- 16.0: , , 🇨🇶
- 15.1: 🐦🔥, 🧑🧑🧒🧒, 👩🏽🦽➡️, 🇲🇶
- 15.0: 🩷, 🫸🏼, 🐦⬛
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Дополнительные функции для работы с emoji2
После того как вы добавите библиотеку emoji2 в приложение, вы сможете включить дополнительные функции, описанные в этом разделе.
Как настроить emoji2 для использования другого шрифта или поставщика скачиваемых шрифтов
Чтобы настроить emoji2 для использования другого шрифта или поставщика скачиваемых шрифтов, выполните следующие действия:
Чтобы отключить
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>Выполните одно из следующих действий:
Используйте конфигурацию по умолчанию, вызвав
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, выполните следующие действия:
Включить объекты
emoji2-bundledиemoji2:implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"Настройте
emoji2для использования встроенной конфигурации:Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
Протестируйте интеграцию, выполнив описанные выше действия по включению
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 КБ ОЗУ для хранения метаданных эмодзи.