Prendre en charge les emoji modernes

L'ensemble standard d'emoji est actualisé tous les ans par Unicode, car leur utilisation augmente rapidement pour tous les types d'applications.

Si votre application affiche du contenu Internet ou fournit de la saisie de texte, nous vous recommandons vivement de prendre en charge les dernières polices d'emoji. Sinon, les emoji ultérieurs peuvent s'afficher sous la forme d'une petite zone carrée nommée tofu (théâtre ) ou d'autres séquences d'emoji mal affichées.

Android 11 (niveau d'API 30) ou version antérieure ne peut pas mettre à jour la police des emoji. Les applications qui les affichent sur ces versions doivent donc être mises à jour manuellement.

Voici des exemples d'emoji modernes.

Exemples Version
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0 (septembre 2021)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (septembre 2020)
🥲 🥷🏿 🐻‍❄️ 13.0 (mars 2020)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (octobre 2019)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (février 2019)

La bibliothèque androidx.emoji2:emoji2 offre une rétrocompatibilité plus simple avec les versions antérieures d'Android. La bibliothèque emoji2 est une dépendance de la bibliothèque AppCompat et ne nécessite aucune configuration supplémentaire pour fonctionner.

Compatibilité avec les emoji dans Compose

La nomenclature de mars 2023 (Compose UI 1.4) est compatible avec la dernière version des emoji, y compris la rétrocompatibilité avec les anciennes versions d'Android jusqu'à l'API 21. Cette page explique comment configurer les emoji modernes dans le système View. Pour en savoir plus, consultez la page Emoji dans Compose.

Conditions préalables

Pour vérifier que votre application affiche correctement les emoji les plus récents, lancez-la sur un appareil équipé d'Android 10 (niveau d'API 29) ou version antérieure. Cette page présente les emoji modernes que vous pouvez afficher à des fins de test.

Utilisez AppCompat pour prendre en charge les derniers emoji.

AppCompat 1.4 prend en charge les emoji.

Pour utiliser AppCompat afin de prendre en charge les emoji, procédez comme suit:

  1. Vérifiez que votre module dépend de la version 1.4.0-alpha01 ou ultérieure de la bibliothèque AppCompat.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. Assurez-vous que toutes les activités qui affichent du texte étendent la classe AppCompatActivity.

    Kotlin

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

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
    
  3. Testez votre intégration en lançant votre application sur un appareil équipé d'Android 10 ou version antérieure et en affichant la chaîne de test suivante. Assurez-vous que tous les caractères s'affichent correctement.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😝 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, Within ❄️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, MONTH🏻 🤝 🏼
    • 12.0: 🦩, 🦻🏿, MONTH🏼 🤝 daily🏻

Votre application affiche automatiquement des emoji rétrocompatibles sur tous les appareils qui proposent un fournisseur de polices téléchargeables compatible avec emoji2, tels que les appareils fonctionnant par les services Google Play.

Si votre application utilise AppCompat, mais affiche du tofu (configuration)

Dans certains cas, votre application peut afficher du tofu au lieu de l'emoji approprié, même si vous ajoutez la bibliothèque AppCompat. Vous trouverez ci-dessous des explications et solutions possibles.

Vous exécutez l'application sur un appareil récemment flashé ou sur un nouvel émulateur.

Effacez les données des services Google Play de l'application pour effacer toute mise en cache des polices susceptible de se produire au démarrage. Le problème est généralement résolu en quelques heures.

Pour effacer les données de l'application, procédez comme suit:

  1. Accédez aux paramètres de votre appareil Android.

  2. Appuyez sur Applications et notifications.

  3. Appuyez sur Afficher toutes les applications ou sur Infos sur les applis.

  4. Faites défiler les applications et appuyez sur Services Google Play.

  5. Appuyez sur Stockage et cache.

  6. Sélectionnez Vider le cache.

Votre application n'utilise pas de classe textuelle AppCompat.

Cela peut se produire si vous n'étendez pas AppCompatActivity ou si vous instanciez une vue dans le code, par exemple TextView. Vérifiez les cas de figure suivants :

  • L'activité étend AppCompatActivity.
  • Si vous créez la vue dans le code, utilisez la sous-classe AppCompat appropriée.

AppCompatActivity gonfle automatiquement AppCompatTextView à la place de TextView lorsque vous gonflez le code XML. Vous n'avez donc pas besoin de mettre à jour votre fichier XML.

Le téléphone de test n'est pas compatible avec les polices téléchargeables

Vérifiez que DefaultEmojiCompatConfig.create renvoie une configuration non nulle.

Un émulateur d'API doté d'un niveau d'API antérieur n'a pas mis à niveau les services Google Play

Lorsque vous utilisez un émulateur à un niveau d'API antérieur, vous devrez peut-être mettre à jour les services Google Play groupés pour emoji2 afin de trouver le fournisseur de polices. Pour ce faire, connectez-vous au Google Play Store dans l'émulateur.

Pour vérifier qu'une version compatible est installée, procédez comme suit:

  1. Exécutez la commande suivante :

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. Vérifiez que la valeur de versionCode est supérieure à 211200000.

Prendre en charge les emoji sans AppCompat

Si votre application ne peut pas inclure AppCompat, elle peut utiliser emoji2 directement. Cette méthode nécessite plus d'efforts. N'utilisez cette méthode que si votre application ne peut pas utiliser AppCompat.

Pour prendre en charge les emoji sans la bibliothèque AppCompat, procédez comme suit:

  1. Dans le fichier build.gradle de votre application, incluez emoji2 et emoji2-views.

    build.gradle
    
    def emojiVersion = "1.0.0-alpha03"
    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-views:$emojiVersion"
    

    Le module emoji2-views fournit des sous-classes de TextView, Button et EditText qui implémentent EmojiCompat. Ne l'utilisez pas dans une application qui inclut AppCompat, car elle implémente déjà EmojiCompat.

  2. En XML et dans le code, où que vous utilisiez TextView, EditText ou Button, utilisez plutôt EmojiTextView, EmojiEditText ou EmojiButton.

    activity_main.xml
    
    <androidx.emoji2.widget.EmojiTextView ... />
    <androidx.emoji2.widget.EmojiEditText ... />
    <androidx.emoji2.widget.EmojiButton ... />
    

    En incluant le module emoji2, le système utilise le fournisseur de polices téléchargeables par défaut pour charger automatiquement la police emoji peu de temps après le démarrage de l'application. Aucune configuration supplémentaire n'est nécessaire.

  3. Pour tester votre intégration, lancez votre application sur un appareil équipé d'Android 11 ou version antérieure et affichez les chaînes de test suivantes. Assurez-vous que tous les caractères s'affichent correctement.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😝 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, Within ❄️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, MONTH🏻 🤝 🏼
    • 12.0: 🦩, 🦻🏿, MONTH🏼 🤝 daily🏻

Utiliser EmojiCompat sans widgets

EmojiCompat utilise EmojiSpan pour afficher les images correctes. Par conséquent, il doit convertir tout objet CharSequence donné en objet Spanned avec des objets EmojiSpan. La classe EmojiCompat fournit la méthode process() pour convertir CharSequences en instances Spanned. Avec cette méthode, vous pouvez appeler process() en arrière-plan et mettre en cache les résultats, ce qui améliore les performances de votre application.

Kotlin

val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")

Java

CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");

Utiliser EmojiCompat pour les éditeurs de mode de saisie

La classe EmojiCompat permet aux claviers d'afficher les emoji compatibles avec l'application avec laquelle ils interagissent. Les éditeurs de mode de saisie (IME) peuvent utiliser la méthode getEmojiMatch() pour vérifier si une instance de EmojiCompat est capable d'afficher un emoji. Cette méthode prend un CharSequence d'emoji et renvoie true si EmojiCompat peut détecter et afficher l'emoji.

Le clavier peut également vérifier la version de EmojiCompat compatible avec l'application afin de déterminer l'emoji à afficher dans la palette. Pour vérifier la version, le cas échéant, le clavier peut rechercher les touches suivantes dans le bundle EditorInfo.extras:

  • EDITOR_INFO_METAVERSION_KEY : représente la version des métadonnées d'emoji utilisée par l'application. Si cette clé n'existe pas, l'application n'utilise pas EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY : si la clé existe et est définie sur true, l'application configure EmojiCompat pour remplacer tous les emoji, même s'ils sont présents dans le système.

Découvrez comment configurer une instance d'EmojiCompat.

Utiliser des emoji dans les affichages personnalisés

Si votre application comporte des vues personnalisées qui sont des sous-classes directes ou indirectes de TextView (par exemple, Button, Switch ou EditText) et que ces vues peuvent afficher du contenu généré par l'utilisateur, elles doivent chacune implémenter EmojiCompat.

Le processus varie selon que votre application utilise ou non la bibliothèque AppCompat.

Ajouter des vues personnalisées pour les applications avec AppCompat

Si votre application utilise AppCompat, étendez l'implémentation de AppCompat au lieu de celle de la plate-forme. Utilisez le tableau suivant pour savoir comment étendre vos vues dans AppCompat:

Au lieu d'étendre... Prolonger
TextView AppCompatTextView
EditText AppCompatEditText
ToggleButton AppCompatToggleButton
Switch SwitchCompat
Button AppCompatButton
CheckedTextView AppCompatCheckedTextView
RadioButton AppCompatRadioButton
CheckBox AppCompatCheckBox
AutoCompleteTextView AppCompatAutoCompleteTextView
MultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView

Ajouter des vues personnalisées pour les applications sans AppCompat

Si votre application n'utilise pas AppCompat, utilisez les assistants d'intégration des vues du module emoji2-views-helper conçus pour être utilisés dans les vues personnalisées. Il s'agit des assistants utilisés par la bibliothèque AppCompat pour implémenter la compatibilité avec les emoji.

Procédez comme suit pour prendre en charge les affichages personnalisés pour les applications qui n'utilisent pas AppCompat.

  1. Ajoutez la bibliothèque emoji2-views-helper:

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. Suivez les instructions pour inclure EmojiTextViewHelper ou EmojiEditTextHelper dans les affichages personnalisés de votre application.

  3. Testez votre intégration en lançant votre application sur un appareil équipé d'Android 10 ou version antérieure et en affichant la chaîne de test suivante. Assurez-vous que tous les caractères s'affichent correctement.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😝 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, Within ❄️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, MONTH🏻 🤝 🏼
    • 12.0: 🦩, 🦻🏿, MONTH🏼 🤝 daily🏻

Fonctionnalités facultatives pour la gestion des emoji2

Après avoir inclus la bibliothèque emoji2 dans votre application, vous pouvez ajouter les fonctionnalités facultatives décrites dans cette section.

Configurer emoji2 pour utiliser une autre police ou un fournisseur de polices téléchargeable

Pour configurer emoji2 afin d'utiliser une autre police ou un fournisseur de polices téléchargeables, procédez comme suit:

  1. Désactivez EmojiCompatInitializer en ajoutant le code suivant à votre fichier manifeste:

    <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. Effectuez l'une des opérations suivantes :

    • Utilisez la configuration par défaut en appelant DefaultEmojiCompatConfiguration.create(context).

    • Créez votre propre configuration pour charger des polices à partir d'une autre source à l'aide de EmojiCompat.Config. Cette classe fournit plusieurs options permettant de modifier le comportement de EmojiCompat, comme décrit dans la section suivante.

Modifier votre comportement EmojiCompat

Vous pouvez utiliser une instance de EmojiCompat.Config pour modifier le comportement de EmojiCompat.

L'option de configuration la plus importante est setMetadataLoadStrategy(), qui contrôle à quel moment EmojiCompat charge la police. Le chargement de la police commence dès que EmojiCompat.load() est appelé, ce qui déclenche tous les téléchargements nécessaires. Le système crée un thread pour le téléchargement des polices, sauf si votre application en fournit un.

LOAD_STRATEGY_MANUAL vous permet de contrôler quand EmojiCompat.load() est appelé, et LOAD_STRATEGY_DEFAULT fait démarrer le chargement de manière synchrone dans l'appel de EmojiCompat.init().

La plupart des applications utilisent LOAD_STRATEGY_MANUAL afin de pouvoir contrôler le thread et le temps de chargement des polices. Votre application doit différer l'affichage du premier écran pour éviter l'introduction de latence au démarrage. EmojiCompatInitializer suit cette pratique et reporte le chargement de la police emoji jusqu'à ce que le premier écran soit réactivé.

Utilisez les méthodes suivantes de la classe de base pour définir d'autres aspects de la configuration:

  • setReplaceAll() : détermine si EmojiCompat remplace tous les emoji trouvés par des instances de EmojiSpan. Par défaut, lorsque EmojiCompat déduit que le système peut afficher un emoji, il ne le remplace pas. Lorsque ce paramètre est défini sur true, EmojiCompat remplace tous les emoji par des objets EmojiSpan.
  • setEmojiSpanIndicatorEnabled() : indique si EmojiCompat remplace un emoji par un objet EmojiSpan. Lorsque ce paramètre est défini sur true, EmojiCompat dessine un arrière-plan pour EmojiSpan. Cette méthode est principalement utilisée à des fins de débogage.
  • setEmojiSpanIndicatorColor : définit la couleur pour indiquer un EmojiSpan. La valeur par défaut est GREEN.
  • registerInitCallback() : informe l'application de l'état d'initialisation de EmojiCompat.

Ajouter des écouteurs d'initialisation

Les classes EmojiCompat et EmojiCompat.Config fournissent les méthodes registerInitCallback() et unregisterInitCallback() pour enregistrer et annuler l'enregistrement des rappels d'initialisation. Votre application utilise ces rappels pour attendre que EmojiCompat soit initialisé avant de traiter les emoji sur un thread d'arrière-plan ou dans un affichage personnalisé.

Pour utiliser ces méthodes, créez une instance de la classe EmojiCompat.InitCallback. Appelez ces méthodes et transmettez l'instance de la classe EmojiCompat.InitCallback. Une fois l'initialisation réussie, la classe EmojiCompat appelle la méthode onInitialized(). Si la bibliothèque ne s'initialise pas, la classe EmojiCompat appelle la méthode onFailed().

Pour vérifier l'état d'initialisation à tout moment, appelez la méthode getLoadState(). Cette méthode renvoie l'une des valeurs suivantes : LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED ou LOAD_STATE_FAILED.

Prise en charge des polices groupées avec emoji2

Vous pouvez utiliser l'artefact emoji2-bundled pour intégrer une police emoji à votre application. Toutefois, comme la police NotoColorEmoji dépasse 10 Mo, nous vous recommandons vivement d'utiliser des polices téléchargeables dans votre application lorsque cela est possible. L'artefact emoji2-bundled est destiné aux applications installées sur des appareils non compatibles avec les polices téléchargeables.

Pour utiliser l'artefact emoji2-bundled, procédez comme suit:

  1. Incluez les artefacts emoji2-bundled et emoji2:

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. Configurez emoji2 pour utiliser la configuration groupée:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))
    

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
    
  3. Testez l'intégration en suivant les étapes précédentes pour inclure emojicompat avec ou sans AppCompat. Assurez-vous que la chaîne de test s'affiche correctement.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😝 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, Within ❄️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, MONTH🏻 🤝 🏼
    • 12.0: 🦩, 🦻🏿, MONTH🏼 🤝 daily🏻

Impact de la configuration automatique d'EmojiCompat

Le système applique la configuration par défaut à l'aide de la bibliothèque de démarrage, EmojiCompatInitializer et DefaultEmojiCompatConfig.

Une fois la première activité reprise dans votre application, l'initialiseur planifie le chargement de la police emoji. Ce court délai permet à votre application d'afficher son contenu initial sans aucune latence potentielle en raison du chargement des polices dans un thread en arrière-plan.

DefaultEmojiCompatConfig recherche un fournisseur de polices téléchargeables installé par le système qui implémente l'interface EmojiCompat, comme les services Google Play. Sur les appareils équipés des services Google Play, la police se charge à l'aide des services Google Play.

L'initialiseur crée un thread d'arrière-plan pour charger la police des emoji. Le téléchargement de la police peut prendre jusqu'à 10 secondes avant l'expiration du délai. Une fois la police téléchargée, il faut environ 150 millisecondes sur un thread d'arrière-plan pour initialiser EmojiCompat.

Différez l'initialisation de EmojiCompat, même si vous désactivez EmojiCompatInitializer. Si vous configurez manuellement EmojiCompat, appelez EmojiCompat.load() après avoir affiché le premier écran de votre application pour éviter les conflits en arrière-plan lors du premier chargement de l'écran.

Après le chargement, EmojiCompat utilise environ 300 Ko de RAM pour contenir les métadonnées des emoji.