Стандартный набор эмодзи ежегодно обновляется 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
и не требует дополнительной настройки для работы.
Поддержка эмодзи в Compose
В выпуске BOM за март 2023 г. ( Compose UI 1.4 ) реализована поддержка последней версии эмодзи, включая обратную совместимость со старыми версиями Android вплоть до API 21. На этой странице рассказывается, как настроить современные эмодзи в системе View. Подробнее см. на странице «Эмодзи в Compose» .
Предпосылки
Чтобы убедиться, что ваше приложение корректно отображает новые эмодзи, запустите его на устройстве под управлением 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
.Котлин
MyActivity.kt class MyActivity: AppCompatActivity { ... }
Ява
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
автоматически заполняет AppCompatTextView
вместо TextView
при заполнении XML, поэтому вам не нужно обновлять свой XML.
Тестовый телефон не поддерживает загружаемые шрифты.
Убедитесь, что DefaultEmojiCompatConfig.create
возвращает ненулевую конфигурацию.
Эмулятор на более раннем уровне API не обновил сервисы Google Play.
При использовании эмулятора с API более ранней версии может потребоваться обновить пакет сервисов Google Play для emoji2
, чтобы найти поставщика шрифтов. Для этого войдите в Google Play Store на эмуляторе.
Чтобы проверить, установлена ли совместимая версия, выполните следующие действия:
Выполните следующую команду:
adb shell dumpsys package com.google.android.gms | grep version
Убедитесь, что
versionCode
больше211200000
.
Поддержка эмодзи без AppCompat
Если ваше приложение не поддерживает AppCompat
, оно может напрямую использовать emoji2
. Это требует дополнительных усилий, поэтому используйте этот метод только в том случае, если ваше приложение не поддерживает AppCompat
.
Для поддержки эмодзи без библиотеки AppCompat
выполните следующие действия:
В файле
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
.В 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()
в фоновом режиме и кэшировать результаты, что повышает производительность вашего приложения.
Котлин
val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")
Ява
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
для использования встроенной конфигурации:Котлин
EmojiCompat.init(BundledEmojiCompatConfig(context))
Ява
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 шрифт загружается через сервисы Google Play.
Инициализатор создаёт фоновый поток для загрузки шрифта эмодзи. Загрузка шрифта может занять до 10 секунд, после чего время ожидания истечёт. После загрузки шрифта инициализация EmojiCompat
в фоновом потоке занимает около 150 миллисекунд.
Отложите инициализацию EmojiCompat
, даже если вы отключили EmojiCompatInitializer
. Если вы настраиваете EmojiCompat
вручную , вызывайте EmojiCompat.load()
после отображения первого экрана приложения, чтобы избежать фонового конфликта при загрузке первого экрана.
После загрузки EmojiCompat
использует около 300 КБ оперативной памяти для хранения метаданных эмодзи.