Moderne Emojis unterstützen

Der Standardsatz von Emojis wird jährlich von Unicode aktualisiert, da die Nutzung von Emojis für alle Arten von Apps rasant zunimmt.

Wenn in deiner App Internetinhalte oder Texteingabemöglichkeiten zur Verfügung stehen, empfehlen wir dringend, die neuesten Emoji-Schriftarten zu unterstützen. Andernfalls wird später möglicherweise ein kleines quadratisches Feld mit dem Namen Tofu (Mittelpunkt) oder andere falsch gerenderte Emoji-Sequenzen angezeigt.

Bei Android-Version 11 (API-Level 30) und niedriger kann die Emoji-Schriftart nicht aktualisiert werden. Apps, in denen sie angezeigt werden, müssen daher manuell aktualisiert werden.

Hier einige Beispiele für moderne Emojis.

Beispiele Version
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0 (September 2021)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (September 2020)
🥲 🥷🏿 🐻‍❄️ 13.0 (März 2020)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (Oktober 2019)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (Februar 2019)

Die androidx.emoji2:emoji2-Bibliothek bietet eine einfachere Abwärtskompatibilität mit niedrigeren Android-Versionen. Die emoji2-Bibliothek ist eine Abhängigkeit der AppCompat-Bibliothek und erfordert keine weitere Konfiguration.

Unterstützung von Emojis in der Funktion „Compose“

BOM März 2023 (Compose UI 1.4) unterstützt die neueste Emoji-Version, einschließlich der Abwärtskompatibilität mit älteren Android-Versionen bis API 21. Auf dieser Seite wird beschrieben, wie Sie moderne Emojis im Ansichtssystem konfigurieren. Weitere Informationen finden Sie auf der Seite Emojis beim Schreiben.

Voraussetzungen

Wenn du prüfen möchtest, ob in deiner App neuere Emojis korrekt angezeigt werden, starte sie auf einem Gerät mit Android 10 (API-Level 29) oder niedriger. Diese Seite enthält moderne Emojis, die Sie zu Testzwecken anzeigen können.

AppCompat verwenden, um die neuesten Emojis zu unterstützen

AppCompat 1.4 unterstützt Emojis.

So verwenden Sie AppCompat zur Unterstützung von Emojis:

  1. Prüfen Sie, ob Ihr Modul von der AppCompat-Bibliotheksversion 1.4.0-alpha01 oder höher abhängig ist.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. Sorgen Sie dafür, dass alle Aktivitäten, die Text anzeigen, die Klasse AppCompatActivity erweitern.

    Kotlin

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

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
    
  3. Teste deine Integration, indem du die App auf einem Gerät mit Android 10 oder niedriger startest und den folgenden Teststring aufrufst. Achtet darauf, dass alle Zeichen richtig gerendert werden.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🌴 ❯
    • 12.1: 🧑 🦰, 🧑🏿 🦯, 😝 🤝 🚀🏼
    • 12.0: 🦩, 🦻🏿, {4/}🏼 🤝 ♀️

Ihre App zeigt automatisch abwärtskompatible Emojis auf allen Geräten an, die einen emoji2-kompatiblen Anbieter von Schriftarten zum Download anbieten, z. B. auf Geräten, die von Google Play-Diensten unterstützt werden.

Wenn Ihre App AppCompat verwendet, aber Tofu angezeigt wird (Zahl)

In einigen Fällen zeigt deine App möglicherweise Tofu anstelle des richtigen Emojis an, auch wenn du die AppCompat-Bibliothek hinzugefügt hast. Im Folgenden sind mögliche Erklärungen und Lösungen aufgeführt.

Du führst die App auf einem kürzlich geflashten Gerät oder in einem neuen Emulator aus.

Löschen Sie die Daten der Google Play-Dienste der App, um alle Schriftarten-Caching zu löschen, die möglicherweise beim Start auftreten. Dadurch wird das Problem in der Regel nach einigen Stunden behoben.

So löschen Sie die App-Daten:

  1. Öffnen Sie auf Ihrem Android-Gerät die Einstellungen.

  2. Tippe auf Apps & Benachrichtigungen.

  3. Tippen Sie auf Alle Apps anzeigen oder App-Info.

  4. Scrollen Sie durch die Apps und tippen Sie auf Google Play-Dienste.

  5. Tippen Sie auf Speicher und Cache.

  6. Tippen Sie auf Cache leeren.

Ihre Anwendung verwendet keine textbezogene AppCompat-Klasse

Dies kann passieren, wenn Sie AppCompatActivity nicht erweitern oder eine Ansicht im Code instanziieren (z. B. TextView). Überprüfen Sie Folgendes:

  • Die Aktivität erweitert AppCompatActivity.
  • Wenn Sie die Ansicht im Code erstellen, verwenden Sie die richtige AppCompat-Unterklasse.

AppCompatActivity erhöht automatisch AppCompatTextView anstelle von TextView, wenn XML aufgebläht wird, sodass du den XML-Code nicht aktualisieren musst.

Das Test-Smartphone unterstützt keine herunterladbaren Schriftarten

Prüfen Sie, ob DefaultEmojiCompatConfig.create eine Konfiguration ungleich null zurückgibt.

Die Google Play-Dienste wurden durch einen Emulator mit einem früheren API-Level nicht aktualisiert

Wenn Sie einen Emulator auf einem früheren API-Level verwenden, müssen Sie möglicherweise die gebündelten Google Play-Dienste für emoji2 aktualisieren, um den Schriftartanbieter zu finden. Melden Sie sich dazu im Google Play Store im Emulator an.

So überprüfen Sie, ob eine kompatible Version installiert ist:

  1. Führen Sie den folgenden Befehl aus:

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. Prüfen Sie, ob versionCode größer als 211200000 ist.

Emojis ohne AppCompat unterstützen

Wenn deine App AppCompat nicht enthalten kann, kann sie direkt emoji2 verwenden. Dies ist aufwendiger. Verwenden Sie diese Methode also nur, wenn Ihre App AppCompat nicht verwenden kann.

So unterstützen Sie Emojis ohne die AppCompat-Bibliothek:

  1. Füge in der Datei build.gradle deiner App emoji2 und emoji2-views ein.

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

    Das Modul emoji2-views enthält untergeordnete Klassen von TextView, Button und EditText, die EmojiCompat implementieren. Verwende ihn nicht in einer Anwendung, die AppCompat enthält, da EmojiCompat bereits implementiert ist.

  2. Verwenden Sie in XML und Code überall dort, wo Sie TextView, EditText oder Button verwenden, stattdessen EmojiTextView, EmojiEditText oder EmojiButton.

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

    Wenn Sie das Modul emoji2 einbinden, verwendet das System den Standardanbieter für herunterladbare Schriftarten, um die Emoji-Schriftart kurz nach dem Start der App automatisch zu laden. Es ist keine weitere Konfiguration erforderlich.

  3. Starte zum Testen der Integration deine App auf einem Gerät mit Android 11 oder niedriger und präsentiere die folgenden Teststrings. Achtet darauf, dass alle Zeichen richtig gerendert werden.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🌴 ❯
    • 12.1: 🧑 🦰, 🧑🏿 🦯, 😝 🤝 🚀🏼
    • 12.0: 🦩, 🦻🏿, {4/}🏼 🤝 ♀️

EmojiCompat ohne Widgets verwenden

EmojiCompat verwendet EmojiSpan, um korrekte Bilder zu rendern. Daher muss jedes CharSequence-Objekt in ein Spanned-Objekt mit EmojiSpan-Objekten konvertiert werden. Die EmojiCompat-Klasse stellt die Methode process() bereit, um CharSequences in Spanned-Instanzen zu konvertieren. Mit dieser Methode können Sie process() im Hintergrund aufrufen und die Ergebnisse im Cache speichern. Dadurch wird die Leistung Ihrer App verbessert.

Kotlin

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

Java

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

EmojiCompat für Eingabemethodeneditoren verwenden

Mit der Klasse EmojiCompat können Tastaturen die Emojis rendern, die von der App unterstützt werden, mit der sie interagieren. Eingabemethoden-Editoren (IMEs) können mit der Methode getEmojiMatch() prüfen, ob eine Instanz von EmojiCompat in der Lage ist, ein Emoji zu rendern. Diese Methode verwendet ein CharSequence eines Emojis und gibt true zurück, wenn EmojiCompat das Emoji erkennen und rendern kann.

Die Tastatur kann auch die von der App unterstützte Version von EmojiCompat prüfen, um festzustellen, welches Emoji in der Palette gerendert werden soll. Zum Prüfen der Version kann die Tastatur im Bundle EditorInfo.extras nach den folgenden Tasten suchen (falls verfügbar):

  • EDITOR_INFO_METAVERSION_KEY: Stellt die Version der Emoji-Metadaten dar, die die App verwendet. Ist dieser Schlüssel nicht vorhanden, verwendet die Anwendung EmojiCompat nicht.
  • EDITOR_INFO_REPLACE_ALL_KEY: Wenn der Schlüssel vorhanden und auf true gesetzt ist, konfiguriert die App EmojiCompat so, dass alle Emojis ersetzt werden, auch wenn sie im System vorhanden sind.

Weitere Informationen zum Konfigurieren einer Instanz von EmojiCompat

Emojis in benutzerdefinierten Ansichten verwenden

Wenn Ihre App benutzerdefinierte Ansichten hat, die direkte oder indirekte abgeleitete Klassen von TextView sind, z. B. Button, Switch oder EditText, und in diesen Ansichten von Nutzern erstellte Inhalte angezeigt werden können, müssen sie EmojiCompat implementieren.

Die Vorgehensweise hängt davon ab, ob deine App die AppCompat-Bibliothek verwendet.

Benutzerdefinierte Ansichten für Anwendungen mit AppCompat hinzufügen

Wenn deine App AppCompat verwendet, erweitere die AppCompat-Implementierung anstelle der Plattformimplementierung. Verwenden Sie die folgende Tabelle als Leitfaden zum Erweitern der Ansichten in AppCompat:

Statt zu verlängern... Erweitern
TextView AppCompatTextView
EditText AppCompatEditText
ToggleButton AppCompatToggleButton
Switch SwitchCompat
Button AppCompatButton
CheckedTextView AppCompatCheckedTextView
RadioButton AppCompatRadioButton
CheckBox AppCompatCheckBox
AutoCompleteTextView AppCompatAutoCompleteTextView
MultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView

Benutzerdefinierte Ansichten für Apps ohne AppCompat hinzufügen

Wenn AppCompat in Ihrer App nicht verwendet wird, verwenden Sie die Hilfsfunktionen für die Integration von Ansichten im Modul emoji2-views-helper, die für die Verwendung in benutzerdefinierten Ansichten entwickelt wurden. Das sind die Hilfsprogramme, mit denen die AppCompat-Bibliothek die Emoji-Unterstützung implementiert.

Führen Sie die folgenden Schritte aus, um benutzerdefinierte Ansichten für Apps zu unterstützen, die AppCompat nicht verwenden.

  1. Fügen Sie die emoji2-views-helper-Bibliothek hinzu:

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. Folgen Sie der Anleitung, um EmojiTextViewHelper oder EmojiEditTextHelper in die benutzerdefinierten Ansichten Ihrer App einzufügen.

  3. Teste deine Integration, indem du die App auf einem Gerät mit Android 10 oder niedriger startest und den folgenden Teststring aufrufst. Achtet darauf, dass alle Zeichen richtig gerendert werden.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🌴 ❯
    • 12.1: 🧑 🦰, 🧑🏿 🦯, 😝 🤝 🚀🏼
    • 12.0: 🦩, 🦻🏿, {4/}🏼 🤝 ♀️

Optionale Funktionen für den Umgang mit Emojis2

Nachdem Sie die emoji2-Bibliothek in Ihre App eingebunden haben, können Sie die in diesem Abschnitt beschriebenen optionalen Features hinzufügen.

Für Emojis2 eine andere Schriftart oder eine andere herunterladbare Schriftart konfigurieren

So konfigurieren Sie emoji2 für die Verwendung einer anderen Schriftart oder eines herunterladbaren Schriftartanbieters:

  1. Deaktivieren Sie EmojiCompatInitializer, indem Sie Ihrem Manifest Folgendes hinzufügen:

    <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. Führen Sie einen der folgenden Schritte aus:

    • Verwenden Sie die Standardkonfiguration. Rufen Sie dazu DefaultEmojiCompatConfiguration.create(context) auf.

    • Erstellen Sie Ihre eigene Konfiguration, um Schriftarten aus einer anderen Quelle mit EmojiCompat.Config zu laden. Diese Klasse bietet mehrere Optionen zum Ändern des EmojiCompat-Verhaltens, wie im folgenden Abschnitt beschrieben.

EmojiCompat-Verhalten ändern

Sie können eine Instanz von EmojiCompat.Config verwenden, um das Verhalten von EmojiCompat zu ändern.

Die wichtigste Konfigurationsoption ist setMetadataLoadStrategy(). Damit wird festgelegt, wann EmojiCompat die Schriftart lädt. Das Laden der Schriftart beginnt, sobald EmojiCompat.load() aufgerufen wird. Dadurch werden alle erforderlichen Downloads ausgelöst. Das System erstellt einen Thread zum Herunterladen von Schriftarten, sofern Ihre App keinen Thread bereitstellt.

Mit LOAD_STRATEGY_MANUAL können Sie festlegen, wann EmojiCompat.load() aufgerufen wird. Mit LOAD_STRATEGY_DEFAULT wird das Laden im Aufruf von EmojiCompat.init() synchron gestartet.

Die meisten Anwendungen verwenden LOAD_STRATEGY_MANUAL, damit sie den Thread und den Zeitpunkt des Ladens von Schriftarten steuern können. Ihre Anwendung muss den Vorgang bis zum Erscheinen des ersten Bildschirms verzögern, um Verzögerungen beim Start zu vermeiden. EmojiCompatInitializer folgt dieser Übung und verzögert das Laden der Emoji-Schriftart, bis der erste Bildschirm fortgesetzt wird.

Verwenden Sie die folgenden Methoden aus der Basisklasse, um andere Aspekte der Konfiguration festzulegen:

  • setReplaceAll(): Bestimmt, ob EmojiCompat alle gefundenen Emojis durch Instanzen von EmojiSpan ersetzt. Wenn EmojiCompat ermittelt, dass das System ein Emoji rendern kann, wird dieses Emoji standardmäßig nicht ersetzt. Wenn true festgelegt ist, ersetzt EmojiCompat alle Emojis durch EmojiSpan-Objekte.
  • setEmojiSpanIndicatorEnabled(): gibt an, ob EmojiCompat ein Emoji durch ein EmojiSpan-Objekt ersetzt. Wenn true festgelegt ist, zeichnet EmojiCompat einen Hintergrund für EmojiSpan. Diese Methode wird hauptsächlich zum Zweck der Fehlerbehebung verwendet.
  • setEmojiSpanIndicatorColor: Legt die Farbe zur Kennzeichnung eines EmojiSpan fest. Der Standardwert ist GREEN.
  • registerInitCallback(): Informiert eine App über den Status der EmojiCompat-Initialisierung.

Initialisierungs-Listener hinzufügen

Die Klassen EmojiCompat und EmojiCompat.Config stellen die Methoden registerInitCallback() und unregisterInitCallback() zum Registrieren und Aufheben der Registrierung von Initialisierungs-Callbacks bereit. Deine App verwendet diese Callbacks, um zu warten, bis EmojiCompat initialisiert wurde, bevor du Emojis in einem Hintergrundthread oder in einer benutzerdefinierten Ansicht verarbeitet.

Erstellen Sie eine Instanz der Klasse EmojiCompat.InitCallback, um diese Methoden zu verwenden. Rufen Sie diese Methoden auf und übergeben Sie die Instanz der EmojiCompat.InitCallback-Klasse. Nach erfolgreicher Initialisierung ruft die Klasse EmojiCompat die Methode onInitialized() auf. Wenn die Bibliothek nicht initialisiert werden kann, ruft die Klasse EmojiCompat die Methode onFailed() auf.

Sie können jederzeit den Initialisierungsstatus prüfen, indem Sie die Methode getLoadState() aufrufen. Diese Methode gibt einen der folgenden Werte zurück: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED oder LOAD_STATE_FAILED.

Gebündelte Schriftarten mit Emojis2 unterstützen

Mit dem Artefakt emoji2-bundled kannst du eine Emoji-Schriftart in deiner App bündeln. Da die Schriftart NotoColorEmoji jedoch größer als 10 MB ist, empfehlen wir deiner App dringend, herunterladbare Schriftarten nach Möglichkeit zu verwenden. Das Artefakt emoji2-bundled ist für Apps auf Geräten vorgesehen, die keine herunterladbaren Schriftarten unterstützen.

So verwenden Sie das Artefakt emoji2-bundled:

  1. Artefakte vom Typ emoji2-bundled und emoji2 einschließen:

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. Konfigurieren Sie emoji2 für die Verwendung der gebündelten Konfiguration:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))
    

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
    
  3. Führe zum Testen der Integration die vorherigen Schritte aus, um emojicompat mit oder ohne AppCompat einzuschließen. Prüfen Sie, ob der Teststring korrekt angezeigt wird.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🌴 ❯
    • 12.1: 🧑 🦰, 🧑🏿 🦯, 😝 🤝 🚀🏼
    • 12.0: 🦩, 🦻🏿, {4/}🏼 🤝 ♀️

Auswirkungen der automatischen EmojiCompat-Konfiguration

Das System wendet die Standardkonfiguration mithilfe der Startbibliothek, EmojiCompatInitializer und DefaultEmojiCompatConfig an.

Nachdem die erste Aktivität in Ihrer App fortgesetzt wird, plant der Initialisierer das Laden der Emoji-Schriftart. Durch diese kurze Verzögerung kann Ihre Anwendung den ersten Inhalt ohne potenzielle Latenz anzeigen, die durch das Laden von Schriftarten in einem Hintergrundthread verursacht wird.

DefaultEmojiCompatConfig sucht nach einem vom System installierten herunterladbaren Schriftartanbieter, der die EmojiCompat-Schnittstelle implementiert (z. B. Google Play-Dienste). Auf Geräten mit Google Play-Diensten wird die Schriftart mithilfe der Google Play-Dienste geladen.

Der Initialisierer erstellt einen Hintergrundthread zum Laden der Emoji-Schriftart. Der Download der Schriftart kann bis zu 10 Sekunden dauern, bis eine Zeitüberschreitung auftritt. Nachdem die Schriftart heruntergeladen wurde, dauert es etwa 150 Millisekunden, EmojiCompat in einem Hintergrundthread zu initialisieren.

Sie können die Initialisierung von EmojiCompat auf später verschieben, auch wenn Sie EmojiCompatInitializer deaktivieren. Wenn Sie EmojiCompat manuell konfigurieren, rufen Sie EmojiCompat.load() nach dem ersten Bildschirm der App auf, um Hintergrundkonflikte beim ersten Bildschirmaufbau zu vermeiden.

Nach dem Laden verwendet EmojiCompat etwa 300 KB RAM zum Speichern der Emoji-Metadaten.