Emoji2:让旧设备正确渲染表情 · AndroidX 源码指南
AAndroidX 源码指南
文字与表情
文字与表情 · androidx.emoji2

Emoji2:让旧设备正确渲染表情Emoji2 1.6.0

初始化 EmojiCompat、处理 CharSequence,以及 Bundled 与 Views 扩展的用法。

最后更新 2026-08-01

复制即用

依赖:

implementation("androidx.emoji2:emoji2-bundled:1.6.0")

使用 Bundled 配置初始化(放在 Application 的 onCreate):

import android.app.Application
import androidx.emoji2.text.EmojiCompat
import androidx.emoji2.bundled.BundledEmojiCompatConfig

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        val config = BundledEmojiCompatConfig(this)
        EmojiCompat.init(config)
    }
}

处理字符串:

import androidx.emoji2.text.EmojiCompat

// 在表情元数据加载完成后调用
val processed: CharSequence = EmojiCompat.get().process("你好 🚀")

监听加载状态:

import androidx.emoji2.text.EmojiCompat

val callback = object : EmojiCompat.InitCallback() {
    override fun onInitialized() {
        // 可以安全 process() 了
    }
    override fun onFailed(throwable: Throwable?) {}
}
EmojiCompat.get().registerInitCallback(callback)

常见陷阱

  • process() 抛异常:元数据未加载完成时调用 process() 会抛 IllegalStateException,先注册 InitCallback 或用 getLoadState() 判断。
  • 重复 initEmojiCompat.init 只调用一次,重复会抛异常(单例)。
  • 下载配置依赖网络DefaultEmojiCompatConfig.create(context) 走下载,离线设备回退 Bundled。
  • Compose 场景:Compose 文本默认渲染表情,通常不需要 emoji2。

要点

  • EmojiCompat.init(config) 只调用一次(EmojiCompat.java 单例)。
  • process() 在元数据未加载完成时会抛异常;先注册 InitCallback 或用 getLoadState() 判断(LOAD_STATE_LOADING/SUCCEEDED/FAILED)。
  • Bundled 配置内置字体,无需网络;非 Bundled 的 DefaultEmojiCompatConfig.create(context) 会走下载。
  • View 体系用 emoji2-viewsEmojiTextView 等自动处理;Compose 通常不需要。

相关页面