Поддержите современные смайлы

Попробуйте способ 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 и не требует дополнительной настройки для работы.

Поддержка эмодзи в Compose

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

Предпосылки

Чтобы убедиться, что ваше приложение правильно отображает новые эмодзи, запустите его на устройстве под управлением 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 .

    Котлин

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

    Ява

    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 автоматически заполняет AppCompatTextView вместо TextView при заполнении XML, поэтому вам не нужно обновлять XML.

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

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

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

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

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

  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 , система использует поставщика загружаемых шрифтов по умолчанию для автоматической загрузки шрифта emoji вскоре после запуска приложения. Дальнейшая настройка не требуется.

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

Котлин

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 .

  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 для использования встроенной конфигурации:

    Котлин

    EmojiCompat.init(BundledEmojiCompatConfig(context))

    Ява

    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, это загружает шрифт с помощью сервисов Google Play.

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

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

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