El conjunto estándar de emojis se actualiza anualmente con Unicode, ya que el uso de emojis aumenta rápidamente en todos los tipos de apps.
Si tu app muestra contenido de Internet o proporciona entrada de texto, te recomendamos que admitas las fuentes de emojis más recientes. De lo contrario, es posible que los emojis posteriores se muestren como un pequeño cuadro cuadrado llamado tofu (☐) o como otras secuencias de emojis renderizadas de forma incorrecta.
Las versiones de Android 11 (nivel de API 30) y anteriores no pueden actualizar la fuente de emojis, por lo que las apps que los muestran en esas versiones deben actualizarse manualmente.
Los siguientes son ejemplos de emojis modernos.
| Ejemplos | Versión |
|---|---|
| 🇨🇶 | 16.0 (septiembre de 2024) |
| 🐦🔥 🧑🧑🧒🧒 👩🏽🦽➡️ 🇲🇶 | 15.1 (septiembre de 2023) |
| 🩷 🫸🏼 🐦⬛ | 15.0 (septiembre de 2022) |
| 🫠 🫱🏼🫲🏿 🫰🏽 | 14.0 (septiembre de 2021) |
| 😶🌫️ 🧔🏻♀️ 🧑🏿❤️🧑🏾 | 13.1 (septiembre de 2020) |
| 🥲 🥷🏿 🐻❄️ | 13.0 (marzo de 2020) |
| 🧑🏻🦰 🧑🏿🦯 👩🏻🤝👩🏼 | 12.1 (octubre de 2019) |
| 🦩 🦻🏿 👩🏼🤝👩🏻 | 12.0 (febrero de 2019) |
La biblioteca androidx.emoji2:emoji2 proporciona una retrocompatibilidad más simple con versiones anteriores de Android. La biblioteca emoji2 es una dependencia de la biblioteca AppCompat y no requiere más configuración para funcionar.
Compatibilidad con emojis en Compose
La BOM de marzo de 2023 (IU de Compose 1.4) ofrece compatibilidad con la versión más reciente de emojis, incluida la retrocompatibilidad con versiones anteriores de Android hasta la API 21. En esta página, se explica cómo configurar emojis modernos en el sistema de vistas. Consulta la página Emojis en Compose para obtener más información.
Requisitos previos
Para confirmar que tu app muestra correctamente los emojis más recientes, ejecútala en un dispositivo con Android 10 (nivel de API 29) o una versión anterior. Esta página incluye emojis modernos que puedes mostrar para realizar pruebas.
Usa AppCompat para admitir los emojis más recientes
AppCompat 1.4 incluye compatibilidad con emojis.
Para usar AppCompat con el objetivo de admitir emojis, haz lo siguiente:
Verifica que tu módulo dependa de la versión 1.4.0-alpha01 o una posterior de la biblioteca
AppCompat.build.gradle // Ensure version is 1.4.0-alpha01 or higher. implementation "androidx.appcompat:appcompat.$appcompatVersion"Asegúrate de que todas las actividades que muestren texto extiendan la clase
AppCompatActivity.Kotlin
MyActivity.kt class MyActivity: AppCompatActivity { ... }
Java
MyActivity.java class MyActivity extends AppCompatActivity { ... }
Para probar la integración, inicia la app en un dispositivo que ejecute Android 10 o una versión anterior, y muestra la siguiente cadena de prueba. Asegúrate de que todos los caracteres se rendericen correctamente.
- 16.0: , , 🇨🇶
- 15.1: 🐦🔥, 🧑🧑🧒🧒, 👩🏽🦽➡️, 🇲🇶
- 15.0: 🩷, 🫸🏼, 🐦⬛
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Tu app muestra automáticamente emojis retrocompatibles en todos los dispositivos que proporcionan un proveedor de fuentes descargables compatible con emoji2, como los dispositivos que usan los Servicios de Google Play.
Si tu app usa AppCompat, pero muestra tofu (☐)
En algunos casos, es posible que tu app muestre tofu en lugar del emoji adecuado, incluso si agregas la biblioteca de AppCompat. A continuación, se indican las posibles explicaciones y
soluciones.
Estás ejecutando la app en un dispositivo que se actualizó recientemente o en un emulador nuevo.
Borra los datos de los Servicios de Google Play de la app para borrar cualquier almacenamiento en caché de fuentes que pueda ocurrir durante el inicio. Por lo general, esto resuelve el problema después de unas horas.
Para borrar los datos de la app, haz lo siguiente:
Abre Configuración en tu dispositivo Android.
Presiona Apps y notificaciones
Presiona Ver todas las apps o Información de las apps.
Desplázate por las apps y presiona Servicios de Google Play.
Presiona Almacenamiento y caché.
Presiona Borrar caché.
Tu app no usa una clase relacionada con texto de AppCompat
Esto puede suceder si no extiendes AppCompatActivity o si creas una instancia de una vista en el código, como TextView. Comprueba lo siguiente:
- La actividad extiende
AppCompatActivity. - Si creas la vista en el código, usa la subclase
AppCompatcorrecta.
AppCompatActivity aumenta automáticamente AppCompatTextView en lugar de TextView cuando se aumenta el XML, de modo que no necesitas actualizar el XML.
El teléfono de prueba no admite fuentes descargables
Verifica que DefaultEmojiCompatConfig.create muestre una configuración no nula.
Un emulador en un nivel de API anterior no actualizó los Servicios de Google Play.
Cuando uses un emulador en un nivel de API anterior, es posible que debas actualizar los Servicios de Google Play incluidos para que emoji2 encuentre el proveedor de fuentes. Para ello, accede a Google Play Store en el emulador.
Para verificar que se haya instalado una versión compatible, haz lo siguiente:
Ejecuta el siguiente comando:
adb shell dumpsys package com.google.android.gms | grep versionVerifica que el
versionCodesea mayor que211200000.
Cómo admitir emojis sin AppCompat
Si tu app no puede incluir AppCompat, puede usar emoji2 directamente. Esto
requiere más trabajo, por lo que solo debes usar este método si tu app no puede usar AppCompat.
Para admitir emojis sin la biblioteca AppCompat, haz lo siguiente:
En el archivo
build.gradlede tu app, incluyeemoji2yemoji2-views.build.gradle def emojiVersion = "1.0.0-alpha03" implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-views:$emojiVersion"El módulo
emoji2-viewsproporciona subclases deTextView,ButtonyEditTextque implementanEmojiCompat. No la uses en una app que incluyaAppCompat, ya que esta ya implementaEmojiCompat.En XML y código, donde uses
TextView,EditTextoButton, usaEmojiTextView,EmojiEditTextoEmojiButtonen su lugar.activity_main.xml <androidx.emoji2.widget.EmojiTextView ... /> <androidx.emoji2.widget.EmojiEditText ... /> <androidx.emoji2.widget.EmojiButton ... />Cuando se incluye el módulo
emoji2, el sistema usa el proveedor de fuentes descargables predeterminado para cargar la fuente de emojis automáticamente poco después del inicio de la app. No se necesita ninguna configuración adicional.Para probar la integración, inicia la app en un dispositivo que ejecute Android 11 o una versión anterior, y que muestre las siguientes cadenas de prueba. Asegúrate de que todos los caracteres se rendericen correctamente.
- 16.0: , , 🇨🇶
- 15.1: 🐦🔥, 🧑🧑🧒🧒, 👩🏽🦽➡️, 🇲🇶
- 15.0: 🩷, 🫸🏼, 🐦⬛
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Cómo usar EmojiCompat sin widgets
EmojiCompat usa EmojiSpan para renderizar las imágenes correctas. Por lo tanto, debe convertir cualquier objeto CharSequence determinado en un objeto Spanned con objetos EmojiSpan.
La clase EmojiCompat proporciona el método process() para convertir CharSequences en instancias de Spanned. Con este método, puedes llamar a process() en segundo plano y almacenar en caché los resultados, lo que mejora el rendimiento de tu app.
Kotlin
val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")
Java
CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");
Cómo usar EmojiCompat para editores de métodos de entrada
La clase EmojiCompat permite que los teclados rendericen el emoji compatible con la app con la que interactúan. Los editores de métodos de entrada (IME) pueden usar el método getEmojiMatch() para verificar si una instancia de EmojiCompat puede renderizar un emoji. Este método toma un CharSequence de un emoji y devuelve true si EmojiCompat puede detectar y renderizar el emoji.
El teclado también puede consultar la versión de EmojiCompat que admite la app para determinar qué emojis debe renderizar en la paleta. Para ello, si está disponible, el teclado puede buscar las siguientes claves en el paquete EditorInfo.extras:
EDITOR_INFO_METAVERSION_KEY: Representa la versión de los metadatos de emojis que usa la app. Si esta clave no existe, la app no usaEmojiCompat.EDITOR_INFO_REPLACE_ALL_KEY: Si la clave existe y se establece entrue, la app configuraEmojiCompatpara reemplazar todos los emojis, incluso si están presentes en el sistema.
Obtén más información para configurar una instancia de EmojiCompat.
Cómo usar emojis en vistas personalizadas
Si tu app tiene vistas personalizadas que son subclases directas o indirectas de TextView (por ejemplo, Button, Switch o EditText) y esas vistas pueden mostrar contenido generado por usuarios, cada una debe implementar EmojiCompat.
El proceso varía según si tu app usa la biblioteca AppCompat.
Cómo agregar vistas personalizadas para apps con AppCompat
Si tu app usa AppCompat, extiende la implementación de AppCompat en lugar de la implementación de la plataforma. Usa la siguiente tabla como guía para extender tus vistas en AppCompat:
| En lugar de extender… | Extiende |
|---|---|
TextView
|
AppCompatTextView
|
EditText
|
AppCompatEditText
|
ToggleButton
|
AppCompatToggleButton
|
Switch
|
SwitchCompat
|
Button
|
AppCompatButton
|
CheckedTextView
|
AppCompatCheckedTextView
|
RadioButton
|
AppCompatRadioButton
|
CheckBox
|
AppCompatCheckBox
|
AutoCompleteTextView
|
AppCompatAutoCompleteTextView
|
MultiAutoCompleteTextView
|
AppCompatMultiAutoCompleteTextView
|
Cómo agregar vistas personalizadas para apps sin AppCompat
Si tu app no usa AppCompat, agrega los asistentes de integración de vistas en el módulo emoji2-views-helper que están diseñados para usarse en vistas personalizadas. Estos son los asistentes que usa la biblioteca AppCompat para implementar la compatibilidad con emojis.
Completa los siguientes pasos a fin de admitir vistas personalizadas en apps que no usen AppCompat.
Agrega la biblioteca
emoji2-views-helper:implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"Sigue las instrucciones para incluir
EmojiTextViewHelperoEmojiEditTextHelperen las vistas personalizadas de tu app.Para probar la integración, inicia la app en un dispositivo que ejecute Android 10 o una versión anterior, y muestra la siguiente cadena de prueba. Asegúrate de que todos los caracteres se rendericen correctamente.
- 16.0: , , 🇨🇶
- 15.1: 🐦🔥, 🧑🧑🧒🧒, 👩🏽🦽➡️, 🇲🇶
- 15.0: 🩷, 🫸🏼, 🐦⬛
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Funciones opcionales para controlar los emojis2
Después de incluir la biblioteca de emoji2 en tu app, puedes agregar las funciones opcionales que se describen en esta sección.
Cómo configurar emoji2 para usar una fuente o un proveedor de fuentes descargables diferentes
A fin de configurar emoji2 para usar una fuente o un proveedor de fuentes descargables diferentes, haz lo siguiente:
Inhabilita el
EmojiCompatInitializeragregando lo siguiente a tu manifiesto:<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>Realiza una de las siguientes acciones:
Llama a
DefaultEmojiCompatConfiguration.create(context)para usar la configuración predeterminada.Crea tu propia configuración para cargar fuentes de otra fuente mediante
EmojiCompat.Config. Esta clase proporciona varias opciones para modificar el comportamiento de tuEmojiCompat, como se describe en la siguiente sección.
Cómo modificar el comportamiento de tu EmojiCompat
Puedes usar una instancia de EmojiCompat.Config para modificar el comportamiento de EmojiCompat.
La opción de configuración más importante es setMetadataLoadStrategy(), que controla cuándo EmojiCompat carga la fuente. La carga de fuentes comienza en cuanto se llama a EmojiCompat.load(), lo que activa las descargas necesarias. El sistema crea un subproceso para la descarga de fuentes, a menos que tu app proporcione uno.
LOAD_STRATEGY_MANUAL te permite controlar cuándo se llama a EmojiCompat.load(), y LOAD_STRATEGY_DEFAULT hace que la carga comience de forma síncrona en la llamada a EmojiCompat.init().
La mayoría de las apps usan LOAD_STRATEGY_MANUAL para poder controlar el subproceso y el tiempo de carga de las fuentes. Tu app debe diferir hasta después de que se muestre la primera pantalla para evitar que se produzca latencia de inicio. EmojiCompatInitializer sigue esta práctica y pospone la carga de la fuente de emojis hasta que se reanude la primera pantalla.
Usa los siguientes métodos de la clase base para establecer otros aspectos de la configuración:
setReplaceAll(): Determina siEmojiCompatreemplaza todos los emojis que encuentra por instancias deEmojiSpan. De forma predeterminada, cuandoEmojiCompatinfiere que el sistema puede renderizar un emoji, no lo reemplaza. Cuando se establece entrue,EmojiCompatreemplaza todos los emojis por objetosEmojiSpan.setEmojiSpanIndicatorEnabled(): Indica siEmojiCompatreemplaza un emoji por un objetoEmojiSpan. Cuando se establece entrue,EmojiCompatdibuja un fondo paraEmojiSpan. Este método se utiliza principalmente para fines de depuración.setEmojiSpanIndicatorColor: Establece el color para indicar unEmojiSpan. El valor predeterminado esGREEN.registerInitCallback(): Informa a una app sobre el estado de la inicialización deEmojiCompat.
Cómo agregar objetos de escucha de inicialización
Las clases EmojiCompat y EmojiCompat.Config proporcionan los métodos registerInitCallback() y unregisterInitCallback() para registrar y cancelar el registro de las devoluciones de llamada de inicialización. Tu app usa estas devoluciones de llamada para esperar hasta que se inicialice EmojiCompat antes de procesar emojis en un subproceso en segundo plano o en una vista personalizada.
A fin de usar estos métodos, crea una instancia de la clase EmojiCompat.InitCallback. Llama a estos métodos y pasa la instancia de la clase EmojiCompat.InitCallback. Cuando la inicialización se completa de forma correcta, la clase EmojiCompat llama al método onInitialized(). Si la biblioteca no se inicializa, la clase EmojiCompat llama al método onFailed().
Para verificar el estado de inicialización en cualquier momento, llama al método getLoadState(). Este método devuelve uno de los siguientes valores:
LOAD_STATE_LOADING,
LOAD_STATE_SUCCEEDED
o
LOAD_STATE_FAILED.
Cómo admitir fuentes empaquetadas con emojis2
Puedes usar el artefacto emoji2-bundled para empaquetar una fuente de emojis en tu app.
Sin embargo, como la fuente NotoColorEmoji supera los 10 MB, te recomendamos
que tu app use fuentes descargables siempre que sea posible. El artefacto emoji2-bundled está destinado a apps en dispositivos que no admiten fuentes descargables.
Para usar el artefacto emoji2-bundled, haz lo siguiente:
Incluye los artefactos
emoji2-bundledyemoji2:implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"Configura
emoji2para usar la configuración empaquetada:Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
Para probar la integración, sigue los pasos anteriores para incluir
emojicompatcon o sinAppCompat. Asegúrate de que la cadena de prueba se muestre correctamente.- 16.0: , , 🇨🇶
- 15.1: 🐦🔥, 🧑🧑🧒🧒, 👩🏽🦽➡️, 🇲🇶
- 15.0: 🩷, 🫸🏼, 🐦⬛
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Impacto de la configuración automática de EmojiCompat
El sistema aplica la configuración predeterminada con la biblioteca de inicio,
EmojiCompatInitializer y
DefaultEmojiCompatConfig.
Después de que se reanuda la primera actividad en tu app, el inicializador programa la carga de la fuente de emojis. Esta breve demora permite que tu app muestre su contenido inicial sin ninguna latencia potencial debido a la carga de fuentes en un subproceso en segundo plano.
DefaultEmojiCompatConfig busca un proveedor de fuentes descargables instalado en el sistema que implemente la interfaz EmojiCompat, como los Servicios de Google Play. En dispositivos con los Servicios de Google Play, la fuente se carga usando esa tecnología.
El inicializador crea un subproceso en segundo plano para cargar la fuente de emojis, y la descarga de la fuente puede tardar hasta 10 segundos antes de que se agote el tiempo de espera. Después de descargar la fuente, un subproceso en segundo plano tarda unos 150 milisegundos en inicializar EmojiCompat.
Difiere la inicialización de EmojiCompat, incluso si inhabilitas EmojiCompatInitializer. Si configuras EmojiCompat de forma manual, llama a EmojiCompat.load() después de que se muestre la primera pantalla de tu app para evitar la contención en segundo plano con la carga de la primera pantalla.
Después de la carga, EmojiCompat usa alrededor de 300 KB de RAM para contener los metadatos de los emojis.