Il set standard di emoji viene aggiornato annualmente da Unicode, in quanto l'utilizzo delle emoji aumenta rapidamente per tutti i tipi di app.
Se la tua app mostra contenuti di internet o offre la possibilità di inserire testo, ti consigliamo vivamente di supportare i caratteri delle emoji più recenti. In caso contrario, le emoji successive potrebbero essere visualizzate come un piccolo riquadro quadrato chiamato tofu (unico) o altre sequenze di emoji visualizzate in modo errato.
Android 11 (livello API 30) e versioni 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 |
---|---|
🫠 🫱🏼🫲🏿 🫰🏽 | 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
più semplice con le versioni precedenti di Android. La libreria emoji2
è una dipendenza della libreria AppCompat
e non richiede ulteriori configurazioni per funzionare.
Supporto delle emoji in Compose
BOM marzo 2023 (Compose UI 1.4) supporta la versione più recente di emoji, inclusa la compatibilità con le versioni precedenti di Android fino all'API 21. In questa pagina viene spiegato come configurare le emoji moderne nel sistema di visualizzazione. Per saperne di più, consulta la pagina Emoji in Scrivi.
Prerequisiti
Per verificare che l'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 mostrare per il test.
Utilizza AppCompat per supportare le emoji più recenti
AppCompat
1.4 include il supporto per le emoji.
Per usare la funzionalità AppCompat
per supportare le emoji, procedi nel seguente modo:
Verifica che il 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"
Assicurati che tutte le attività che mostrano testo estendono la classe
AppCompatActivity
.Kotlin
MyActivity.kt class MyActivity: AppCompatActivity { ... }
Java
MyActivity.java class MyActivity extends AppCompatActivity { ... }
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.
- 14,0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13,1: ✝ 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13:0: 🥲, 🥷🏿, btn definizione
- 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
La tua app mostra automaticamente emoji compatibili con le versioni precedenti su tutti i dispositivi che forniscono un fornitore di caratteri scaricabili compatibile con emoji2
, ad esempio i dispositivi forniti da Google Play Services.
Se l'app utilizza AppCompat, ma mostra tofu ( {/9})
In alcuni casi, l'app potrebbe mostrare tofu anziché l'emoji appropriata, anche se aggiungi la raccolta 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 questo risolve il problema dopo alcune ore.
Per cancellare i dati dell'app, procedi nel seguente modo:
Apri le Impostazioni sul dispositivo Android.
Tocca App e notifiche.
Tocca Mostra tutte le app o Informazioni app.
Scorri le app e tocca Google Play Services.
Tocca Spazio di archiviazione e cache.
Tocca Svuota cache.
La tua app non utilizza una classe correlata al testo di AppCompat
Questo può accadere se non estendi AppCompatActivity
o se crei un'istanza di una visualizzazione nel codice, ad esempio TextView
. Controlla quanto segue.
- L'attività si estende per
AppCompatActivity
. - Se crei la vista nel codice, utilizza la sottoclasse
AppCompat
corretta.
AppCompatActivity
aumenta automaticamente AppCompatTextView
al posto di
TextView
quando gonfia il file XML, quindi non è necessario aggiornare il file XML.
Il telefono di prova non supporta i caratteri scaricabili
Verifica che DefaultEmojiCompatConfig.create
restituisca una configurazione con valore non-null.
Un emulatore con un livello API precedente non ha eseguito l'upgrade di Google Play Services
Quando utilizzi un emulatore con un livello API precedente, potresti dover aggiornare Google Play Services in bundle per emoji2
per trovare il fornitore di caratteri. Per farlo, accedi al Google Play Store dall'emulatore.
Per verificare che sia installata una versione compatibile:
Esegui questo comando:
adb shell dumpsys package com.google.android.gms | grep version
Verifica che il valore di
versionCode
sia superiore a211200000
.
Supporta le emoji senza AppCompat
Se la tua app non può includere AppCompat
, può utilizzare direttamente emoji2
. Questa operazione richiede ulteriore lavoro, quindi utilizza questo metodo solo se la tua app non può utilizzare AppCompat
.
Per supportare le emoji senza la raccolta AppCompat
, segui questi passaggi:
Nel file
build.gradle
della tua app, includiemoji2
eemoji2-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 diTextView
,Button
eEditText
che implementanoEmojiCompat
. Non utilizzarlo in un'app che includeAppCompat
, perché implementa giàEmojiCompat
.In XML e nel codice, ovunque utilizzi
TextView
,EditText
oButton
, usaEmojiTextView
,EmojiEditText
oEmojiButton
.activity_main.xml <androidx.emoji2.widget.EmojiTextView ... /> <androidx.emoji2.widget.EmojiEditText ... /> <androidx.emoji2.widget.EmojiButton ... />
Se includi 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 ulteriore configurazione.Per testare l'integrazione, avvia l'app su un dispositivo con Android 11 o versioni precedenti e che mostra le seguenti stringhe di test. Assicurati che tutti i caratteri vengano visualizzati correttamente.
- 14,0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13,1: ✝ 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13:0: 🥲, 🥷🏿, btn definizione
- 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
Usa EmojiCompat senza widget
EmojiCompat
utilizza EmojiSpan
per
visualizzare le immagini corrette. Di conseguenza, 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
. Con 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 visualizzare le emoji supportate dall'app
con cui stanno interagendo. Gli editor dei metodi di immissione (IME) possono utilizzare il metodo getEmojiMatch()
per verificare se un'istanza di EmojiCompat
è in grado di visualizzare un'emoji. Questo metodo prende un CharSequence
di un'emoji e restituisce true
se EmojiCompat
è in grado di rilevare e visualizzare l'emoji.
La tastiera può anche controllare la versione di EmojiCompat
supportata dall'app per stabilire quali emoji visualizzare nella tavolozza. Per verificare la versione, se disponibile, la tastiera può cercare i seguenti tasti nel bundle EditorInfo.extras
:
EDITOR_INFO_METAVERSION_KEY
: rappresenta la versione dei metadati delle emoji utilizzati dall'app. Se la chiave non esiste, l'app non utilizzaEmojiCompat
.EDITOR_INFO_REPLACE_ALL_KEY
: se la chiave esiste ed è impostata sutrue
, l'app configuraEmojiCompat
per sostituire tutte le emoji, anche se sono presenti nel sistema.
Scopri di più su come configurare un'istanza di EmojiCompat.
Utilizzare emoji nelle visualizzazioni personalizzate
Se la tua app ha viste personalizzate che sono sottoclassi dirette o indirette di TextView
, ad esempio Button
, Switch
o EditText
, e che possono mostrare contenuti generati dagli utenti, entrambe devono implementare EmojiCompat
.
La procedura varia a seconda che l'app utilizzi o meno la raccolta AppCompat
.
Aggiunta di visualizzazioni personalizzate per le app con AppCompat
Se la tua app utilizza AppCompat
, estendi l'implementazione 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
|
Aggiunta di visualizzazioni personalizzate per le app senza AppCompat
Se la tua app non utilizza AppCompat
, usa gli aiutanti di integrazione della visualizzazione nel
modulo emoji2-views-helper
progettati per l'utilizzo nelle visualizzazioni personalizzate. Questi sono gli aiutanti 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
.
Aggiungi la libreria
emoji2-views-helper
:implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
Segui le istruzioni per includere
EmojiTextViewHelper
oEmojiEditTextHelper
nelle visualizzazioni personalizzate della tua app.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.
- 14,0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13,1: ✝ 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13:0: 🥲, 🥷🏿, btn definizione
- 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
Funzionalità facoltative per la gestione delle emoji2
Dopo aver incluso la libreria emoji2
nell'app, puoi aggiungere le funzionalità facoltative descritte in questa sezione.
Configura l'emoji2 in modo da utilizzare un carattere diverso o un fornitore di caratteri scaricabili
Per configurare emoji2
in modo che utilizzi un carattere diverso o un altro fornitore di caratteri scaricabili, procedi nel seguente modo:
Disabilita
EmojiCompatInitializer
aggiungendo quanto segue al tuo 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>
Svolgere una delle seguenti operazioni:
Utilizza la configurazione predefinita chiamando il numero
DefaultEmojiCompatConfiguration.create(context)
.Crea la tua configurazione per caricare i caratteri da un'altra origine utilizzando
EmojiCompat.Config
. Questa classe offre diverse opzioni per modificare il comportamento diEmojiCompat
, 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()
e vengono attivati eventuali download necessari. Il sistema crea un thread per il download dei caratteri, a meno che l'app non ne fornisca uno.
LOAD_STRATEGY_MANUAL
ti consente di controllare quando viene chiamato EmojiCompat.load()
e
LOAD_STRATEGY_DEFAULT
consente di avviare il caricamento in modo sincrono nella chiamata a
EmojiCompat.init()
.
La maggior parte delle app usa LOAD_STRATEGY_MANUAL
per controllare il thread e la tempistica
del caricamento dei caratteri. L'app deve posticipare la visualizzazione della prima schermata per evitare di introdurre latenza di avvio. EmojiCompatInitializer
segue questa pratica e si ferma a caricare il carattere delle emoji fino a quando non riprende la prima schermata.
Utilizza i seguenti metodi dalla classe base per impostare altri aspetti della configurazione:
setReplaceAll()
: determina seEmojiCompat
sostituisce tutte le emoji trovate con istanze diEmojiSpan
. Per impostazione predefinita, quandoEmojiCompat
deduce che il sistema può visualizzare un'emoji, non la sostituisce. Se impostato sutrue
,EmojiCompat
sostituisce tutte le emoji con oggettiEmojiSpan
.setEmojiSpanIndicatorEnabled()
: indica seEmojiCompat
sostituisce un'emoji con un oggettoEmojiSpan
. Se impostato sutrue
,EmojiCompat
disegna uno sfondo perEmojiSpan
. Questo metodo viene utilizzato principalmente per scopi di debug.setEmojiSpanIndicatorColor
: imposta il colore per indicare unEmojiSpan
. Il valore predefinito èGREEN
.registerInitCallback()
: informa un'app sullo stato dell'inizializzazione diEmojiCompat
.
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 in un thread in background o in una visualizzazione personalizzata.
Per utilizzare questi metodi, crea un'istanza della classe EmojiCompat.InitCallback
. Richiama questi metodi e passa l'istanza della classe EmojiCompat.InitCallback
. Se l'inizializzazione ha esito positivo, la classe EmojiCompat
chiama il metodo onInitialized()
. Se l'inizializzazione della libreria non riesce, la classe EmojiCompat
chiama il metodo
onFailed()
.
Per verificare 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'elemento emoji2-bundled
per raggruppare un carattere emoji nella tua app.
Tuttavia, poiché le dimensioni del carattere NotoColorEmoji
superano i 10 MB, ti consigliamo vivamente che la tua app utilizzi caratteri scaricabili, se possibile. L'elemento emoji2-bundled
è destinato alle app sui dispositivi che non supportano i caratteri scaricabili.
Per utilizzare l'artefatto emoji2-bundled
:
Includi elementi
emoji2-bundled
eemoji2
:implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
Configura
emoji2
per utilizzare la configurazione in bundle:Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
Testa l'integrazione seguendo i passaggi precedenti per includere
emojicompat
con o senzaAppCompat
. Assicurati che la stringa di test venga visualizzata correttamente.- 14,0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13,1: ✝ 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13:0: 🥲, 🥷🏿, btn definizione
- 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'inizializzazione pianifica il caricamento dei caratteri delle emoji. Questo breve ritardo consente all'app di visualizzare i contenuti iniziali senza potenziale latenza dovuta al caricamento dei caratteri in un thread in background.
DefaultEmojiCompatConfig
cerca un fornitore di caratteri
scaricabili installato dal sistema che implementi l'interfaccia EmojiCompat
, ad esempio Google Play
services. Sui dispositivi con tecnologia Google Play Services, il carattere viene caricato utilizzando Google Play Services.
L'inizializzazione crea un thread in background per caricare il carattere delle emoji e il download del carattere può richiedere fino a 10 secondi prima del timeout. Dopo aver scaricato il carattere, sono necessari circa 150 millisecondi su un thread in background per inizializzare EmojiCompat
.
Rimanda l'inizializzazione di EmojiCompat
, anche se disabiliti
EmojiCompatInitializer
. Se configuri manualmente EmojiCompat
, chiama EmojiCompat.load()
dopo aver visualizzato 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.