由于所有类型的应用对表情符号的使用都在快速增加,因此标准表情符号集每年都会由 Unicode 进行更新。
如果您的应用显示互联网内容或提供文本输入,我们强烈建议您支持最新的表情符号字体。否则,后续表情符号可能会显示为名为豆腐 (☐) 的小方框或其他呈现不正确的表情符号序列。
Android 11(API 级别 30)及更低版本无法更新表情符号字体,因此在这些版本上显示表情符号的应用必须手动更新。
以下是现代表情符号的示例。
| 示例 | 版本 |
|---|---|
| 🇨🇶 | 16.0(2024 年 9 月) |
| 🐦🔥 🧑🧑🧒🧒 👩🏽🦽➡️ 🇲🇶 | 15.1(2023 年 9 月) |
| 🩷 🫸🏼 🐦⬛ | 15.0(2022 年 9 月) |
| 🫠 🫱🏼🫲🏿 🫰🏽 | 14.0(2021 年 9 月) |
| 😶🌫️ 🧔🏻♀️ 🧑🏿❤️🧑🏾 | 13.1(2020 年 9 月) |
| 🥲 🥷🏿 🐻❄️ | 13.0(2020 年 3 月) |
| 🧑🏻🦰 🧑🏿🦯 👩🏻🤝👩🏼 | 12.1(2019 年 10 月) |
| 🦩 🦻🏿 👩🏼🤝👩🏻 | 12.0(2019 年 2 月) |
androidx.emoji2:emoji2 库可让您更轻松地向后兼容较低的 Android 版本。emoji2 库是 AppCompat 库的依赖项,无需进一步配置即可运行。
Compose 中的表情符号支持
2023 年 3 月的 BOM (Compose UI 1.4) 带来了对最新表情符号版本的支持,包括与低至 API 21 的旧版 Android 的向后兼容性。本页介绍了如何在 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"确保显示文本的所有 activity 都扩展
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),就可能会发生这种情况。检查以下内容:
- activity 会扩展
AppCompatActivity。 - 如果是在代码中创建视图,请使用正确的
AppCompat子类。
在膨胀 XML 时,AppCompatActivity 会自动膨胀 AppCompatTextView 而不是 TextView,因此您无需更新自己的 XML。
测试手机不支持可下载字体
请验证 DefaultEmojiCompatConfig.create 是否会返回非 null 配置。
搭载较低 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 库的情况下支持表情符号,请执行以下操作:
在应用的
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 对象转换为具有 EmojiSpan 对象的 Spanned 对象。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,如果 EmojiCompat 可以检测并呈现该表情符号,则返回 true。
键盘还可以检查应用支持的 EmojiCompat 版本,以确定要在 palette 中呈现的表情符号。如需检查版本(如果可用),键盘可以在 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 MB,我们强烈建议您的应用尽可能使用可下载字体。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));
如需测试集成,请按照上述步骤操作,在使用或不用
AppCompat的情况下添加emojicompat。确保测试字符串正确显示。- 16.0:、、🇨🇶
- 15.1:🐦🔥、🧑🧑🧒🧒、👩🏽🦽➡️、🇲🇶
- 15.0:🩷、🫸🏼、🐦⬛
- 14.0:🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1:😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0:🥲, 🥷🏿, 🐻❄️
- 12.1:🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0:🦩, 🦻🏿, 👩🏼🤝👩🏻
自动化 EmojiCompat 配置的影响
系统会使用启动库 EmojiCompatInitializer 和 DefaultEmojiCompatConfig 应用默认配置。
在应用中的第一个 activity 恢复后,初始化程序会安排表情符号字体加载。这种短暂的延迟可让您的应用显示其初始内容,而不会因后台线程中的字体加载而产生任何潜在延迟。
DefaultEmojiCompatConfig 会查找实现 EmojiCompat 接口的系统安装的可下载字体提供程序,例如 Google Play 服务。在采用 Google Play 服务的设备上,这将使用 Google Play 服务加载字体。
初始化程序会创建一个后台线程来加载表情符号字体,字体下载最多可能需要 10 秒才会超时。下载字体后,在后台线程上初始化 EmojiCompat 大约需要 150 毫秒。
推迟 EmojiCompat 的初始化,即使您停用 EmojiCompatInitializer 也是如此。如果您手动配置 EmojiCompat,请在它显示应用的第一个屏幕后调用 EmojiCompat.load(),以避免与第一个屏幕加载发生后台争用。
加载后,EmojiCompat 会使用大约 300 KB 的 RAM 来保存表情符号元数据。