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

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

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

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

Ниже приведены примеры современных смайлов.

Примеры Версия
🫠 🫱🏼‍🫲🏿 🫰🏽 14,0 (сентябрь 2021 г.)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (сентябрь 2020 г.)
🥲 🥷🏿 🐻‍❄️ 13,0 (март 2020 г.)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (октябрь 2019 г.)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (февраль 2019 г.)

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

Поддержка Emoji в Compose

В спецификации за март 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 .

    Котлин

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

    Ява

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
    
  3. Проверьте свою интеграцию, запустив приложение на устройстве под управлением Android 10 или более ранней версии и отобразив следующую тестовую строку. Убедитесь, что все символы отображаются правильно.

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

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

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

    • 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 КБ ОЗУ для хранения метаданных эмодзи.