Emoji-Kompatibilität

Mithilfe der EmojiCompat-Supportbibliothek sollen Android-Geräte immer die neuesten Emojis verwenden. Dadurch wird verhindert, dass in deiner App fehlende Emoji-Zeichen in Form von ☐ angezeigt werden. Das bedeutet, dass dein Gerät keine Schriftart zum Anzeigen des Textes hat. Wenn du die EmojiCompat-Supportbibliothek verwendest, müssen deine App-Nutzer nicht auf Updates des Android-Betriebssystems warten, um die neuesten Emojis zu erhalten.

Geräte, auf denen Emojis angezeigt werden
Abbildung 1. Emoji-Vergleich

Weitere Informationen finden Sie in den folgenden verwandten Ressourcen:

Wie funktioniert EmojiCompat?

Die EmojiCompat-Supportbibliothek enthält Klassen zur Implementierung der abwärtskompatiblen Emoji-Unterstützung auf Geräten mit Android 4.4 (API-Level 19) und höher. Sie können EmojiCompat mit gebündelten oder herunterladbaren Schriftarten konfigurieren. Weitere Informationen zur Konfiguration finden Sie in den folgenden Abschnitten:

EmojiCompat identifiziert ein Emoji für eine bestimmte CharSequence, ersetzt sie gegebenenfalls durch EmojiSpans und rendert schließlich die Emoji-Glyphen. In Abbildung 2 ist der Prozess demonstriert.

EmojiCompat-Prozess
Abbildung 2: EmojiCompat-Prozess

Konfiguration für herunterladbare Schriftarten

In der Konfiguration für Schriftarten zum Herunterladen wird die Funktion der Supportbibliothek zum Herunterladen von Schriftarten verwendet, um eine Emoji-Schriftart herunterzuladen. Außerdem werden die erforderlichen Emoji-Metadaten aktualisiert, die die EmojiCompat-Supportbibliothek benötigt, um mit den neuesten Versionen der Unicode-Spezifikation Schritt zu halten.

Abhängigkeit von Supportbibliothek hinzufügen

Wenn Sie die EmojiCompat-Supportbibliothek verwenden möchten, müssen Sie die Klassenpfadabhängigkeiten Ihres Anwendungsprojekts in Ihrer Entwicklungsumgebung ändern.

So fügen Sie Ihrem Anwendungsprojekt eine Supportbibliothek hinzu:

  1. Öffnen Sie die Datei build.gradle Ihrer Anwendung.
  2. Fügen Sie die Supportbibliothek zum Abschnitt dependencies hinzu.

Cool

dependencies {
    ...
    implementation "androidx.emoji:emoji:28.0.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.emoji:emoji:28.0.0")
}

Konfiguration der herunterladbaren Schriftart initialisieren

Sie müssen EmojiCompat initialisieren, um die Metadaten und das Schriftbild zu laden. Da die Initialisierung einige Zeit in Anspruch nehmen kann, wird der Initialisierungsprozess auf einem Hintergrundthread ausgeführt.

Führe die folgenden Schritte aus, um EmojiCompat mit der herunterladbaren Schriftartkonfiguration zu initialisieren:

  1. Erstellen Sie eine Instanz der FontRequest-Klasse und geben Sie die Zertifizierungsstelle des Schriftartanbieters, das Paket des Schriftartanbieters, die Schriftartabfrage und eine Liste von Hash-Sätzen für das Zertifikat an. Weitere Informationen zu FontRequest finden Sie in der Dokumentation zu herunterladbaren Schriftarten im Abschnitt Herunterladbare Schriftarten programmatisch verwenden.
  2. Erstellen Sie eine Instanz von FontRequestEmojiCompatConfig und geben Sie Instanzen von Context und FontRequest an.
  3. Initialisieren Sie EmojiCompat, indem Sie die Methode init() aufrufen und die Instanz von FontRequestEmojiCompatConfig übergeben.
  4. Kotlin

    class MyApplication : Application() {
    
        override fun onCreate() {
            super.onCreate()
            val fontRequest = FontRequest(
                    "com.example.fontprovider",
                    "com.example",
                    "emoji compat Font Query",
                    CERTIFICATES
            )
            val config = FontRequestEmojiCompatConfig(this, fontRequest)
            EmojiCompat.init(config)
        }
    }
    

    Java

    public class MyApplication extends Application {
      @Override
       public void onCreate() {
         super.onCreate();
         FontRequest fontRequest = new FontRequest(
           "com.example.fontprovider",
           "com.example",
           "emoji compat Font Query",
           CERTIFICATES);
         EmojiCompat.Config config = new FontRequestEmojiCompatConfig(this, fontRequest);
         EmojiCompat.init(config);
       }
    }
    
  5. Verwende EmojiCompat-Widgets in Layout-XMLs. Wenn Sie AppCompat verwenden, lesen Sie den Abschnitt EmojiCompat-Widgets mit AppCompat verwenden.
  6. <android.support.text.emoji.widget.EmojiTextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiEditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    

Weitere Informationen zum Konfigurieren von EmojiCompat mit der herunterladbaren Schriftartkonfiguration finden Sie in der Beispiel-App zur Emoji-Kompatibilität Java | Kotlin.

Bibliothekskomponenten

Bibliothekskomponenten im EmojiCompat-Prozess
Abbildung 3: Bibliothekskomponenten im EmojiCompat-Prozess
Widgets: EmojiEditText, EmojiTextView, EmojiButton
Standard-Widgetimplementierungen zur Verwendung von EmojiCompat mit TextView, EditText und Button.
EmojiCompat
Öffentliche Hauptoberfläche der Supportbibliothek. Er führt alle externen Aufrufe aus und koordiniert dies mit den anderen Teilen des Systems.
EmojiCompat.Config
Konfiguriert die zu erstellende Singleton-Instanz.
EmojiSpan
: Eine abgeleitete ReplacementSpan-Klasse, die das Zeichen (Sequenzen) ersetzt und die Glyphe rendert.
Schriftart EmojiCompat
EmojiCompat verwendet eine Schriftart, um Emojis anzuzeigen. Diese Schriftart ist eine modifizierte Version der Android-Schriftart für Emojis. Die Schriftart wird so geändert:
  • Um die Abwärtskompatibilität für das Rendern von Emojis zu gewährleisten, werden alle Emoji-Zeichen mit einem einzigen Unicode-Codepunkt in der ergänzenden privaten Nutzungsbereich-A von Unicode dargestellt, die mit U+F0001 beginnt.
  • Zusätzliche Emoji-Metadaten werden in einem Binärformat in die Schriftart eingefügt und zur Laufzeit von EmojiCompat geparst. Die Daten werden mit dem privaten Tag Emji in die Tabelle meta der Schriftart eingebettet.

Konfigurationsoptionen

Mit der Instanz EmojiCompat können Sie das Verhalten von EmojiCompat ändern. Sie können die folgenden Methoden aus der Basisklasse verwenden, um die Konfiguration festzulegen:

Kotlin

val config = FontRequestEmojiCompatConfig(...)
        .setReplaceAll(true)
        .setEmojiSpanIndicatorEnabled(true)
        .setEmojiSpanIndicatorColor(Color.GREEN)
        .registerInitCallback(object: EmojiCompat.InitCallback() {
            ...
        })

Java

EmojiCompat.Config config = new FontRequestEmojiCompatConfig(...)
       .setReplaceAll(true)
       .setEmojiSpanIndicatorEnabled(true)
       .setEmojiSpanIndicatorColor(Color.GREEN)
       .registerInitCallback(new InitCallback() {...})

Initialisierungs-Listener hinzufügen

Die Klassen EmojiCompat und EmojiCompat bieten die Methoden registerInitCallback() und unregisterInitCallback() zum Registrieren eines Initialisierungs-Callbacks. Wenn Sie diese Methoden verwenden möchten, erstellen Sie eine Instanz der Klasse EmojiCompat.InitCallback. Rufen Sie diese Methoden auf und übergeben Sie die Instanz der Klasse EmojiCompat.InitCallback. Wenn die Initialisierung der EmojiCompat-Supportbibliothek erfolgreich ist, 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 den Initialisierungsstatus jederzeit prüfen, indem Sie die Methode getLoadState() aufrufen. Es wird einer der folgenden Werte zurückgegeben: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED oder LOAD_STATE_FAILED.

EmojiCompat mit AppCompat-Widgets verwenden

Wenn du AppCompat widgets verwendest, kannst du EmojiCompat-Widgets verwenden, die von AppCompat widgets reichen.

  1. Fügen Sie die Supportbibliothek dem Abschnitt für Abhängigkeiten hinzu.

    Cool

    dependencies {
        ...
        implementation "androidx.emoji:emoji-bundled:$version"
    }
    

    Kotlin

          dependencies {
              implementation("androidx.emoji:emoji-appcompat:$version")
          }
          

    Cool

          dependencies {
              implementation "androidx.emoji:emoji-appcompat:$version"
          }
          
  2. Verwende EmojiCompat AppCompat Widget-Widgets in Layout-XMLs.
  3. <android.support.text.emoji.widget.EmojiAppCompatTextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiAppCompatEditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiAppCompatButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    

Gebündelte Schriftarten konfigurieren

Die EmojiCompat-Supportbibliothek ist auch in einer gebündelten Schriftartversion verfügbar. Dieses Paket enthält die Schriftart mit den eingebetteten Metadaten. Das Paket enthält auch ein BundledEmojiCompatConfig, das die Metadaten und Schriftarten mithilfe von AssetManager lädt.

Hinweis:Die Schriftgröße wird in mehreren Megabyte angegeben.

Abhängigkeit von Supportbibliothek hinzufügen

Wenn Sie die EmojiCompat-Supportbibliothek mit gebündelter Schriftartkonfiguration verwenden möchten, müssen Sie die Klassenpfadabhängigkeiten Ihres Anwendungsprojekts innerhalb Ihrer Entwicklungsumgebung ändern.

So fügen Sie Ihrem Anwendungsprojekt eine Supportbibliothek hinzu:

  1. Öffnen Sie die Datei build.gradle Ihrer Anwendung.
  2. Fügen Sie die Supportbibliothek zum Abschnitt dependencies hinzu.

Cool

dependencies {
    ...
    implementation "androidx.emoji:emoji:28.0.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.emoji:emoji:28.0.0")
}

Gebündelte Schriftarten zum Konfigurieren von EmojiCompat verwenden

So verwenden Sie gebündelte Schriftarten zum Konfigurieren von EmojiCompat:

  1. Verwenden Sie BundledEmojiCompatConfig, um eine Instanz von EmojiCompat zu erstellen und eine Instanz von Context anzugeben.
  2. Rufen Sie die Methode init() auf, um EmojiCompat zu initialisieren und die Instanz von BundledEmojiCompatConfig zu übergeben.

Kotlin

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        val config = BundledEmojiCompatConfig(this)
        EmojiCompat.init(config)
    }
}

Java

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        EmojiCompat.Config config = new BundledEmojiCompatConfig(this);
        EmojiCompat.init(config);
        ...
    }
}

EmojiCompat ohne Widgets verwenden

EmojiCompat verwendet EmojiSpan, um korrekte Bilder zu rendern. Daher muss er eine gegebene CharSequence-Instanz mit EmojiSpans in Spanned-Instanzen konvertieren. Die Klasse EmojiCompat bietet eine Methode zum Konvertieren von CharSequences in Spanned-Instanzen mit EmojiSpans. Mit dieser Methode können Sie die verarbeiteten Instanzen anstelle des Rohstrings verarbeiten und im Cache speichern, wodurch die Leistung Ihrer Anwendung verbessert wird.

Kotlin

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

Java

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

EmojiCompat für IMEs verwenden

Mithilfe der EmojiCompat-Supportbibliothek können Tastaturen die Emojis rendern, die von der Anwendung unterstützt werden, mit der sie interagieren. IMEs können mit der Methode hasEmojiGlyph() prüfen, ob EmojiCompat ein Emoji rendern kann. 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 der EmojiCompat-Supportbibliothek prüfen, um zu bestimmen, welches Emoji in der Palette gerendert werden soll. Um die Version zu prüfen (falls verfügbar), muss die Tastatur prüfen, ob die folgenden Schlüssel im EditorInfo.extras-Bundle vorhanden sind:

Nach Empfang der Schlüssel im EditorInfo.extras-Bundle kann die Tastatur die hasEmojiGlyph()-Methode verwenden, wobei metadataVersion der Wert für EDITOR_INFO_METAVERSION_KEY ist, um zu prüfen, ob die App ein bestimmtes Emoji rendern kann.

EmojiCompat mit benutzerdefinierten Widgets verwenden

Sie können die Methode process() jederzeit verwenden, um CharSequence in Ihrer Anwendung vorzuverarbeiten und sie jedem Widget hinzuzufügen, das Spanned-Instanzen rendern kann, z. B. TextView. Darüber hinaus bietet EmojiCompat die folgenden Widget-Hilfsklassen, damit Sie Ihre benutzerdefinierten Widgets mit minimalem Aufwand mit Emoji-Unterstützung ergänzen können.

Beispiel-Textansicht

Kotlin

class MyTextView(context: Context) : AppCompatTextView(context) {

    private val emojiTextViewHelper: EmojiTextViewHelper by lazy(LazyThreadSafetyMode.NONE) {
        EmojiTextViewHelper(this).apply {
            updateTransformationMethod()
        }
    }

    override fun setFilters(filters: Array<InputFilter>) {
        super.setFilters(emojiTextViewHelper.getFilters(filters))
    }

    override fun setAllCaps(allCaps: Boolean) {
        super.setAllCaps(allCaps)
        emojiTextViewHelper.setAllCaps(allCaps)
    }
}

Java

public class MyTextView extends AppCompatTextView {
   ...
   public MyTextView(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       getEmojiTextViewHelper().updateTransformationMethod();
   }

   @Override
   public void setFilters(InputFilter[] filters) {
       super.setFilters(getEmojiTextViewHelper().getFilters(filters));
   }

   @Override
   public void setAllCaps(boolean allCaps) {
       super.setAllCaps(allCaps);
       getEmojiTextViewHelper().setAllCaps(allCaps);
   }

   private EmojiTextViewHelper getEmojiTextViewHelper() {
       ...
   }
}
Beispiel für EditText

Kotlin

class MyEditText(context: Context) : AppCompatEditText(context) {

    private val emojiEditTextHelper: EmojiEditTextHelper by lazy(LazyThreadSafetyMode.NONE) {
        EmojiEditTextHelper(this).also {
            super.setKeyListener(it.getKeyListener(keyListener))
        }
    }

    override fun setKeyListener(input: KeyListener?) {
        input?.also {
            super.setKeyListener(emojiEditTextHelper.getKeyListener(it))
        }
    }

    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
        val inputConnection: InputConnection = super.onCreateInputConnection(outAttrs)
        return emojiEditTextHelper.onCreateInputConnection(
                inputConnection,
                outAttrs
        ) as InputConnection
    }
}

Java

public class MyEditText extends AppCompatEditText {
   ...
   public MyEditText(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener()));
   }

   @Override
   public void setKeyListener(android.text.method.KeyListener keyListener) {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener));
   }

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
       InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
       return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
   }

   private EmojiEditTextHelper getEmojiEditTextHelper() {
       ...
   }
}

Häufig gestellte Fragen

  • Wie starte ich den Download einer Schriftart?
  • Die Emoji-Schriftarten werden bei der ersten Anfrage heruntergeladen, falls sie nicht auf dem Gerät vorhanden sind. Die Downloadplanung ist für die App transparent.

  • Wie lange dauert die Initialisierung?
  • Nach dem Herunterladen der Schriftart dauert es etwa 150 Millisekunden, bis EmojiCompat initialisiert wird.

  • Wie viel Speicher nutzt die EmojiCompat-Supportbibliothek?
  • Aktuell wird die Datenstruktur zum Finden des Emojis in den Arbeitsspeicher der App geladen und belegt etwa 200 KB.

  • Kann ich EmojiCompat für eine benutzerdefinierte TextView verwenden?
  • Ja. EmojiCompat bietet Hilfsklassen für benutzerdefinierte Widgets. Es ist auch möglich, einen bestimmten String vorzuverarbeiten und in Spanned umzuwandeln. Weitere Informationen zu Widget-Hilfsklassen finden Sie im Abschnitt EmojiCompat mit benutzerdefinierten Widgets verwenden.

  • Was passiert, wenn ich Widgets in Layout-XMLs auf Geräten mit Android 4.4 (API-Level 19) oder niedriger hinzufüge?
  • Du kannst die EmojiCompat-Supportbibliothek oder die zugehörigen Widgets in Apps einbinden, die Geräte mit Android 4.4 (API-Level 19) oder niedriger unterstützen. Wenn auf dem Gerät jedoch eine Android-Version vor API-Level 19 ausgeführt wird, befinden sich EmojiCompat und die zugehörigen Widgets im Status „Kein Vorgang“. Das bedeutet, dass sich EmojiTextView genau wie ein reguläres TextView verhält. EmojiCompat-Instanz hinzu. Sie wechselt sofort in den Status LOAD_STATE_SUCCEEDED, wenn Sie die Methode init() aufrufen.

Zusätzliche Ressourcen

Weitere Informationen zur Verwendung der EmojiCompat-Mediathek findest du unter EmojiCompat.