Unicode actualiza anualmente el conjunto de emojis estándar, ya que se incrementó rápidamente su uso en todo tipo de apps.
Si tu app muestra contenido de Internet o proporciona entrada de texto, te recomendamos encarecidamente que admitas las fuentes de emojis más recientes. De lo contrario, los emojis nuevos podrían mostrarse como un cuadrado pequeño llamado tofu (☐) o como otras secuencias de emojis renderizadas de manera incorrecta.
Las versiones de Android 11 (nivel de API 30) y anteriores no tienen la capacidad de actualizar la fuente de emojis, por lo que cualquier app que los muestre en ellas debe actualizarse de forma manual.
Estos son algunos ejemplos de emojis modernos.
Ejemplos | Versión |
---|---|
🫠 🫱🏼🫲🏿 🫰🏽 | 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 configuración adicional para funcionar.
Requisitos previos
Para confirmar que tu app muestra correctamente los emojis nuevos, iníciala en un dispositivo que ejecute una versión entre Android 4.4 (nivel de API 19) y Android 10 (nivel de API 29) inclusive. En esta página, encontrarás emojis modernos que puedes usar en tus pruebas.
Usa AppCompat para admitir los emojis más recientes
AppCompat 1.4 incluye retrocompatibilidad para emojis hasta Android 4.4.
Si quieres usar AppCompat para admitir los emojis más recientes, 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 tu integración, inicia tu app en un dispositivo que ejecute Android 10 o una versión anterior y muestra la siguiente string de prueba. Asegúrate de que todos los caracteres se rendericen correctamente.
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Eso es todo. Tu app muestra automáticamente emojis retrocompatibles en todos los dispositivos que tengan fuentes descargables compatibles con emoji2
, como lo que tienen la tecnología de 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 aunque hayas agregado la biblioteca de AppCompat. A continuación, se muestran algunas explicaciones y soluciones posibles.
Ejecutas la app en un dispositivo actualizado recientemente o en un emulador nuevo
Borra los datos de apps de los Servicios de Google Play para eliminar cualquier almacenamiento en caché de fuentes que pudiera haber ocurrido durante el inicio. Una vez que lo hagas, esta situación generalmente se resolverá sola en unas horas.
Para borrar los datos de app, haz lo siguiente:
En tu dispositivo Android, abre Configuración.
En Configuración, 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 ocurrir si no extiendes AppCompatActivity
o si creas una instancia de una vista en código como TextView
. Verifica lo siguiente:
- La actividad extiende
AppCompatActivity
. - Si creas la vista en código, usa la
appcompat subclass
correcta.
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 se usa un emulador en una API anterior, es posible que sea necesario actualizar los paquetes de Servicios de Google Play para que emoji2
encuentre al proveedor de fuentes. Para ello, accede a Google Play Store en el emulador.
Para verificar que se haya instalado una versión suficientemente reciente, haz lo siguiente:
Ejecuta el siguiente comando:
adb shell dumpsys package com.google.android.gms | grep version
Verifica que el
versionCode
sea mayor que211200000
.
Cómo admitir emojis sin AppCompat
Si tu app no incluye appcompat
, puede usar emoji2
directamente. Como este método requiere más trabajo, solo debes usarlo si tu app no puede usar appcompat
.
Para admitir emojis sin la biblioteca de AppCompat, haz lo siguiente:
En el archivo
build.gradle
de tu app, incluyeemoji2
yemoji2-views
.build.gradle def emojiVersion = "1.0.0-alpha03" implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-views:$emojiVersion"
El módulo
emoji2-views
proporciona subclases deTextView
,Button
yEditText
que implementanEmojiCompat
y no deben usarse en una app que incluyaappcompat
porque esta ya implementaEmojiCompat
.En XML o código (donde sea que uses
TextView
,EditText
oButton
), usaEmojiTextView
,EmojiEditText
oEmojiButton
.activity_main.xml <androidx.emoji2.widget.EmojiTextView … /> <androidx.emoji2.widget.EmojiEditText … /> <androidx.emoji2.widget.EmojiButton … />
Si incluyes el módulo
emoji2
, el sistema usa el proveedor de fuentes predeterminado para cargar la fuente de emojis automáticamente poco después del inicio de la app, y no se necesita ninguna configuración adicional.Para probar tu integración, inicia tu app en un dispositivo que ejecute Android 10 o una versión anterior y muestra las siguientes strings de prueba. Asegúrate de que todos los caracteres se rendericen correctamente.
- 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, tiene que convertir cualquier objeto [CharSequence
] dado en uno 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 los resultados en caché, lo que mejora el rendimiento de la 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 los emojis compatibles con la app con la que están interactuando.
Los editores de método de entrada (IME) pueden usar el método hasEmojiGlyph()
para verificar si una instancia de EmojiCompat
es capaz de renderizar un emoji. Este método toma la CharSequence
de un emoji y muestra true
si EmojiCompat
puede detectar y renderizar ese 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 está configurada comotrue
, entonces la app configuraEmojiCompat
para 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 puede mostrar contenido generado por usuarios, cada vista debería implementar EmojiCompat.
El proceso es diferente 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 EmojiTextViewHelper o EmojiEditTextHelper en las vistas personalizadas de tu app.
Para probar tu integración, inicia tu app en un dispositivo que ejecute Android 10 o una versión anterior y muestra la siguiente string de prueba. Asegúrate de que todos los caracteres se rendericen correctamente.
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Funciones opcionales para controlar los emojis2
Después de incluir la biblioteca emoji2
en tu app, puedes optar por 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
EmojiCompatInitializer
. Para ello, agrega lo siguiente al 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 alguna 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 EmojiCompat.
- Llama a
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 creará 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 deberían usar LOAD_STRATEGY_MANUAL
para permitir el control del subproceso y del tiempo de carga de la fuente. En particular, tu app deberá diferir hasta después de que se muestre la primera pantalla para evitar introducir latencia de inicio.
EmojiCompatInitializer
sigue esta práctica y difiere la carga de la fuente de emojis hasta que se haya reanudado la primera pantalla.
Puedes usar los siguientes métodos de la clase base a fin de establecer otros aspectos de la configuración:
setReplaceAll()
: Determina siEmojiCompat
debe reemplazar todos los emojis que encuentre con instancias deEmojiSpan
. De forma predeterminada, cuandoEmojiCompat
infiere que el sistema puede renderizar un emoji, no lo reemplaza. Cuando se establece entrue
, EmojiCompat reemplaza todos los emojis por objetosEmojiSpan
.setEmojiSpanIndicatorEnabled()
: Indica siEmojiCompat
reemplazó un emoji con un objetoEmojiSpan
. Cuando se establece entrue
,EmojiCompat
dibuja un fondo paraEmojiSpan
. Este método se utiliza principalmente para fines de depuración.setEmojiSpanIndicatorColor
: Configura 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 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 comprobar el estado de inicialización en cualquier momento, llama al método getLoadState()
. Con este método, se muestra 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, dado que la fuente actual de NotoColorEmoji
supera los 10 MB, te recomendamos que tu app use fuentes descargables siempre que sea posible. El artefacto emoji2-
bundled
está diseñado para usarse en apps de dispositivos que no admiten fuentes descargables.
Para usar el artefacto emoji2-bundled
, haz lo siguiente:
Incluye los artefactos
emoji2-bundled
yemoji2
.implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
Configura
emoji2
para usar la configuración incluida en el paquete.Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
Para probar la integración, sigue los pasos anteriores a fin de incluir
emojicompat
con o sinappcompat
y asegúrate de que la string de prueba se muestre correctamente.- 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 usando la biblioteca de inicio, EmojiCompatInitializer, y DefaultEmojiCompatConfig.
Poco después de que se reanude la primera actividad en tu app, el inicializador programará la carga de la fuente de emojis. Esta breve demora permite que tu app muestre su contenido inicial sin potencial latencia, ya que la fuente se carga en un subproceso en segundo plano.
DefaultEmojiCompatConfig
busca un proveedor de fuentes descargables instalado por el sistema que implemente la interfaz de 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 agotar 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 primera carga de pantalla.
Después de la carga, EmojiCompat usa alrededor de 300 KB de RAM para contener los metadatos de los emojis.