Стандартный набор эмодзи ежегодно обновляется 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 { ... }
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.
При создании XML-файла AppCompatActivity автоматически создает AppCompatTextView вместо TextView , поэтому вам не нужно обновлять свой 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")
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: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Дополнительные функции для обработки эмодзи2
После добавления библиотеки 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 можно использовать экземпляр класса EmojiCompat.Config .
Наиболее важная опция конфигурации — 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))
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, этот параметр загружает шрифт с использованием сервисов Google Play.
Инициализатор создает фоновый поток для загрузки шрифта эмодзи, и загрузка шрифта может занять до 10 секунд, после чего происходит таймаут. После загрузки шрифта инициализация EmojiCompat занимает приблизительно 150 миллисекунд в фоновом потоке.
Отложите инициализацию EmojiCompat , даже если вы отключили EmojiCompatInitializer . Если вы настраиваете EmojiCompat вручную , вызовите EmojiCompat.load() после отображения первого экрана вашего приложения, чтобы избежать конфликта с фоновым процессом при загрузке первого экрана.
После загрузки EmojiCompat использует около 300 КБ оперативной памяти для хранения метаданных эмодзи.
