Supporto delle emoji moderne

Prova Compose
Jetpack Compose è il toolkit per la UI consigliato per Android. Scopri come supportare le emoji in Compose.

Il set standard di emoji viene aggiornato ogni anno da Unicode, poiché l'utilizzo delle emoji sta aumentando rapidamente per tutti i tipi di app.

Se la tua app mostra contenuti di internet o fornisce l'inserimento di testo, ti consigliamo vivamente di supportare i caratteri emoji più recenti. In caso contrario, le emoji successive potrebbero essere visualizzate come un piccolo riquadro quadrato chiamato tofu (☐) o altre sequenze di emoji visualizzate in modo errato.

Le versioni di Android 11 (livello API 30) e precedenti non possono aggiornare il carattere delle emoji, pertanto le app che le mostrano su queste versioni devono essere aggiornate manualmente.

Di seguito sono riportati alcuni esempi di emoji moderne.

Esempi Versione
🫩 🪉 🇨🇶 16.0 (settembre 2024)
🐦‍🔥 🧑‍🧑‍🧒‍🧒 👩🏽‍🦽‍➡️ 🇲🇶 15.1 (settembre 2023)
🩷 🫸🏼 🐦‍⬛ 15.0 (settembre 2022)
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0 (settembre 2021)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (settembre 2020)
🥲 🥷🏿 🐻‍❄️ 13.0 (marzo 2020)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (ottobre 2019)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (febbraio 2019)

La libreria androidx.emoji2:emoji2 offre una compatibilità con le versioni precedenti di Android più semplice. La libreria emoji2 è una dipendenza della libreria AppCompat e non richiede ulteriori configurazioni per funzionare.

Supporto delle emoji in Scrivi

La BOM di marzo 2023 (Compose UI 1.4) supporta l'ultima versione delle emoji, inclusa la compatibilità con le versioni precedenti di Android fino all'API 21. Questa pagina spiega come configurare le emoji moderne nel sistema View. Per saperne di più, consulta la pagina Emoji in Compose.

Prerequisiti

Per verificare che la tua app mostri correttamente le emoji più recenti, avviala su un dispositivo con Android 10 (livello API 29) o versioni precedenti. Questa pagina include emoji moderne che puoi visualizzare per i test.

Utilizza AppCompat per supportare le emoji più recenti

AppCompat 1.4 include il supporto per le emoji.

Per utilizzare AppCompat per supportare le emoji, segui questi passaggi:

  1. Verifica che il tuo modulo dipenda dalla versione della libreria AppCompat 1.4.0-alpha01 o successiva.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. Assicurati che tutte le attività che mostrano testo estendano la classe AppCompatActivity.

    Kotlin

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

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
  3. Testa l'integrazione avviando l'app su un dispositivo con Android 10 o versioni precedenti e visualizzando la seguente stringa di test. Assicurati che tutti i caratteri vengano visualizzati correttamente.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

La tua app mostra automaticamente le emoji compatibili con le versioni precedenti su tutti i dispositivi che forniscono un provider di font scaricabili compatibile con emoji2, ad esempio i dispositivi con Google Play Services.

Se la tua app utilizza AppCompat, ma mostra tofu (☐)

In alcuni casi, l'app potrebbe mostrare un tofu anziché l'emoji corretta, anche se aggiungi la libreria AppCompat. Di seguito sono riportate le possibili spiegazioni e soluzioni.

Stai eseguendo l'app su un dispositivo di cui è stato eseguito il flashing di recente o su un nuovo emulatore

Cancella i dati di Google Play Services dell'app per cancellare l'eventuale memorizzazione nella cache dei caratteri che potrebbe verificarsi durante l'avvio. In genere, il problema si risolve dopo alcune ore.

Per cancellare i dati dell'app:

  1. Apri le Impostazioni sul tuo dispositivo Android.

  2. Tocca App e notifiche.

  3. Tocca Mostra tutte le app o Informazioni app.

  4. Scorri le app e tocca Google Play Services.

  5. Tocca Spazio di archiviazione e cache.

  6. Tocca Svuota cache.

La tua app non utilizza una classe relativa al testo AppCompat

Questo può accadere se non estendi AppCompatActivity o se crei un'istanza di una visualizzazione nel codice, ad esempio TextView. Verifica quanto segue:

  • L'attività estende AppCompatActivity.
  • Se crei la visualizzazione nel codice, utilizza la sottoclasse AppCompat corretta.

AppCompatActivity espande automaticamente AppCompatTextView al posto di TextView durante l'espansione dell'XML, quindi non è necessario aggiornare l'XML.

Lo smartphone di test non supporta i caratteri scaricabili

Verifica che DefaultEmojiCompatConfig.create restituisca una configurazione non null.

Un emulatore su un livello API precedente non ha eseguito l'upgrade di Google Play Services

Quando utilizzi un emulatore su un livello API precedente, potresti dover aggiornare Google Play Services in bundle per emoji2 per trovare il provider di font. Per farlo, accedi al Google Play Store nell'emulatore.

Per verificare che sia installata una versione compatibile:

  1. Esegui questo comando:

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. Verifica che versionCode sia superiore a 211200000.

Supporto delle emoji senza AppCompat

Se la tua app non può includere AppCompat, può utilizzare direttamente emoji2. Questo metodo richiede più lavoro, quindi utilizzalo solo se la tua app non può utilizzare AppCompat.

Per supportare le emoji senza la libreria AppCompat, segui questi passaggi:

  1. Nel file build.gradle dell'app, includi emoji2 e emoji2-views.

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

    Il modulo emoji2-views fornisce sottoclassi di TextView, Button e EditText che implementano EmojiCompat. Non utilizzarla in un'app che include AppCompat, perché implementa già EmojiCompat.

  2. In XML e nel codice, ovunque utilizzi TextView, EditText o Button, utilizza invece EmojiTextView, EmojiEditText o EmojiButton.

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

    Includendo il modulo emoji2, il sistema utilizza il provider di caratteri scaricabili predefinito per caricare automaticamente il carattere emoji poco dopo l'avvio dell'app. Non è necessaria alcuna ulteriore configurazione.

  3. Per testare l'integrazione, avvia l'app su un dispositivo con Android 11 o versioni precedenti e visualizza le seguenti stringhe di test. Assicurati che tutti i caratteri vengano visualizzati correttamente.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Utilizza EmojiCompat senza widget

EmojiCompat utilizza EmojiSpan per eseguire il rendering delle immagini corrette. Pertanto, deve convertire qualsiasi oggetto CharSequence in un oggetto Spanned con oggetti EmojiSpan. La classe EmojiCompat fornisce il metodo process() per convertire CharSequences in istanze Spanned. Utilizzando questo metodo, puoi chiamare process() in background e memorizzare nella cache i risultati, migliorando le prestazioni della tua app.

Kotlin

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

Java

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

Utilizza EmojiCompat per gli editor del metodo di immissione

La classe EmojiCompat consente alle tastiere di eseguire il rendering delle emoji supportate dall'app con cui interagiscono. Gli editor di metodi di immissione (IME) possono utilizzare il metodo getEmojiMatch() per verificare se un'istanza di EmojiCompat è in grado di eseguire il rendering di un'emoji. Questo metodo accetta un CharSequence di un'emoji e restituisce true se EmojiCompat può rilevare ed eseguire il rendering dell'emoji.

La tastiera può anche controllare la versione di EmojiCompat supportata dall'app per determinare quale emoji mostrare nella tavolozza. Per controllare la versione, se disponibile, la tastiera può cercare le seguenti chiavi nel bundle EditorInfo.extras:

  • EDITOR_INFO_METAVERSION_KEY: rappresenta la versione dei metadati delle emoji utilizzata dall'app. Se questa chiave non esiste, l'app non utilizza EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: se la chiave esiste ed è impostata su true, l'app configura EmojiCompat per sostituire tutte le emoji, anche se sono presenti nel sistema.

Scopri di più su come configurare un'istanza di EmojiCompat.

Utilizza le emoji nelle viste personalizzate

Se la tua app ha visualizzazioni personalizzate che sono sottoclassi dirette o indirette di TextView, ad esempio Button, Switch o EditText, e queste visualizzazioni possono mostrare contenuti generati dagli utenti, ognuna deve implementare EmojiCompat.

La procedura varia a seconda che l'app utilizzi o meno la libreria AppCompat.

Aggiungi visualizzazioni personalizzate per le app con AppCompat

Se la tua app utilizza AppCompat, estendi l'implementazione di AppCompat anziché l'implementazione della piattaforma. Utilizza la seguente tabella come guida per estendere le visualizzazioni in AppCompat:

Invece di estendere… Estendi
TextView AppCompatTextView
EditText AppCompatEditText
ToggleButton AppCompatToggleButton
Switch SwitchCompat
Button AppCompatButton
CheckedTextView AppCompatCheckedTextView
RadioButton AppCompatRadioButton
CheckBox AppCompatCheckBox
AutoCompleteTextView AppCompatAutoCompleteTextView
MultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView

Aggiungi visualizzazioni personalizzate per le app senza AppCompat

Se la tua app non utilizza AppCompat, utilizza gli helper di integrazione delle visualizzazioni nel modulo emoji2-views-helper progettati per l'utilizzo nelle visualizzazioni personalizzate. Questi sono gli helper utilizzati dalla libreria AppCompat per implementare il supporto delle emoji.

Completa i seguenti passaggi per supportare le visualizzazioni personalizzate per le app che non utilizzano AppCompat.

  1. Aggiungi la libreria emoji2-views-helper:

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. Segui le istruzioni per includere EmojiTextViewHelper o EmojiEditTextHelper nelle visualizzazioni personalizzate della tua app.

  3. Testa l'integrazione avviando l'app su un dispositivo con Android 10 o versioni precedenti e visualizzando la seguente stringa di test. Assicurati che tutti i caratteri vengano visualizzati correttamente.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Funzionalità facoltative per la gestione di emoji2

Dopo aver incluso la libreria emoji2 nella tua app, puoi aggiungere le funzionalità facoltative descritte in questa sezione.

Configura emoji2 per utilizzare un carattere diverso o un provider di caratteri scaricabili

Per configurare emoji2 in modo che utilizzi un carattere o un provider di caratteri scaricabili diverso, segui questi passaggi:

  1. Disattiva EmojiCompatInitializer aggiungendo quanto segue al manifest:

    <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. Effettua una delle seguenti operazioni:

    • Utilizza la configurazione predefinita chiamando DefaultEmojiCompatConfiguration.create(context).

    • Crea la tua configurazione per caricare i caratteri da un'altra origine utilizzando EmojiCompat.Config. Questa classe fornisce diverse opzioni per modificare il comportamento di EmojiCompat, come descritto nella sezione seguente.

Modifica il comportamento di EmojiCompat

Puoi utilizzare un'istanza di EmojiCompat.Config per modificare il comportamento di EmojiCompat.

L'opzione di configurazione più importante è setMetadataLoadStrategy(), che controlla quando EmojiCompat carica il carattere. Il caricamento dei caratteri inizia non appena viene chiamato EmojiCompat.load(), il che attiva i download necessari. Il sistema crea un thread per il download dei caratteri, a meno che la tua app non ne fornisca uno.

LOAD_STRATEGY_MANUAL ti consente di controllare quando viene chiamato EmojiCompat.load() e LOAD_STRATEGY_DEFAULT fa iniziare il caricamento in modo sincrono nella chiamata a EmojiCompat.init().

La maggior parte delle app utilizza LOAD_STRATEGY_MANUAL per controllare il thread e la tempistica di caricamento dei caratteri. L'app deve rimandare l'operazione fino alla visualizzazione della prima schermata per evitare di introdurre latenza di avvio. EmojiCompatInitializer segue questa pratica e rimanda il caricamento del carattere emoji a dopo il ripristino della prima schermata.

Utilizza i seguenti metodi della classe base per impostare altri aspetti della configurazione:

  • setReplaceAll(): determina se EmojiCompat sostituisce tutte le emoji che trova con istanze di EmojiSpan. Per impostazione predefinita, quando EmojiCompat deduce che il sistema può eseguire il rendering di un'emoji, non la sostituisce. Se impostato su true, EmojiCompat sostituisce tutte le emoji con oggetti EmojiSpan.
  • setEmojiSpanIndicatorEnabled(): indica se EmojiCompat sostituisce un'emoji con un oggetto EmojiSpan. Se impostato su true, EmojiCompat disegna uno sfondo per EmojiSpan. Questo metodo viene utilizzato principalmente per il debug.
  • setEmojiSpanIndicatorColor: imposta il colore per indicare un EmojiSpan. Il valore predefinito è GREEN.
  • registerInitCallback(): informa un'app dello stato di inizializzazione di EmojiCompat.

Aggiungi listener di inizializzazione

Le classi EmojiCompat e EmojiCompat.Config forniscono i metodi registerInitCallback() e unregisterInitCallback() per registrare e annullare la registrazione dei callback di inizializzazione. La tua app utilizza questi callback per attendere l'inizializzazione di EmojiCompat prima di elaborare le emoji su un thread in background o in una visualizzazione personalizzata.

Per utilizzare questi metodi, crea un'istanza della classe EmojiCompat.InitCallback. Chiama questi metodi e trasmetti l'istanza della classe EmojiCompat.InitCallback. Quando l'inizializzazione va a buon fine, la classe EmojiCompat chiama il metodo onInitialized(). Se l'inizializzazione della libreria non va a buon fine, la classe EmojiCompat chiama il metodo onFailed().

Per controllare lo stato di inizializzazione in qualsiasi momento, chiama il metodo getLoadState(). Questo metodo restituisce uno dei seguenti valori: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, o LOAD_STATE_FAILED.

Supporto dei caratteri in bundle con emoji2

Puoi utilizzare l'artefatto emoji2-bundled per raggruppare un carattere emoji nella tua app. Tuttavia, poiché il carattere NotoColorEmoji supera i 10 MB, consigliamo vivamente alla tua app di utilizzare i caratteri scaricabili, se possibile. L'artefatto emoji2-bundled è destinato alle app su dispositivi che non supportano i caratteri scaricabili.

Per utilizzare l'artefatto emoji2-bundled, segui questi passaggi:

  1. Includi gli artefatti emoji2-bundled e emoji2:

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. Configura emoji2 per utilizzare la configurazione in bundle:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
  3. Testa l'integrazione seguendo i passaggi precedenti per includere emojicompat con o senza AppCompat. Assicurati che la stringa di test venga visualizzata correttamente.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Impatto della configurazione automatica di EmojiCompat

Il sistema applica la configurazione predefinita utilizzando la libreria di avvio, EmojiCompatInitializer e DefaultEmojiCompatConfig.

Dopo che la prima attività riprende nell'app, l'inizializzatore pianifica il caricamento del carattere emoji. Questo breve ritardo consente alla tua app di visualizzare i contenuti iniziali senza potenziali latenze dovute al caricamento dei caratteri in un thread in background.

DefaultEmojiCompatConfig cerca un provider di caratteri scaricabili installato sul sistema che implementi l'interfaccia EmojiCompat, ad esempio Google Play Services. Sui dispositivi con Google Play Services, il carattere viene caricato utilizzando Google Play Services.

L'inizializzatore crea un thread in background per caricare il carattere emoji e il download del carattere può richiedere fino a 10 secondi prima del timeout. Dopo il download del carattere, l'inizializzazione di EmojiCompat richiede circa 150 millisecondi su un thread in background.

Rimanda l'inizializzazione di EmojiCompat, anche se disattivi EmojiCompatInitializer. Se configuri manualmente EmojiCompat, chiama EmojiCompat.load() dopo che viene visualizzata la prima schermata dell'app per evitare conflitti in background con il primo caricamento della schermata.

Dopo il caricamento, EmojiCompat utilizza circa 300 kB di RAM per contenere i metadati delle emoji.