Emoji-Kompatibilität

Mit der EmojiCompat-Supportbibliothek sollen Android-Geräte immer mit den neuesten Emojis auf dem neuesten Stand gehalten werden. So wird verhindert, dass in Ihrer App fehlende Emoji-Zeichen in Form von ☐ angezeigt werden, was darauf hinweist, dass auf Ihrem Gerät keine Schriftart für die Anzeige des Texts vorhanden ist. Wenn Sie die EmojiCompat-Supportbibliothek verwenden, müssen Ihre App-Nutzer nicht auf Android-Betriebssystemupdates warten, um die neuesten Emojis zu erhalten.

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

Weitere Informationen finden Sie unter den folgenden Links:

  • Beispiel-App für die Emoji-Kompatibilität Java | Kotlin

Wie funktioniert EmojiCompat?

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

EmojiCompat identifiziert Emojis für eine bestimmte CharSequence, ersetzt sie bei Bedarf durch EmojiSpans und rendert schließlich die Emoji-Glyphen. Abbildung 2 veranschaulicht den Vorgang.

EmojiCompat-Prozess
Abbildung 2: EmojiCompat-Prozess

Konfiguration der herunterladbaren Schriftarten

Bei der Konfiguration der herunterladbaren Schriftarten wird die Bibliotheksfunktion „Herunterladbare Schriftarten“ verwendet, um eine Emoji-Schriftart herunterzuladen. Außerdem werden die erforderlichen Emoji-Metadaten aktualisiert, die die EmojiCompat-Unterstützungsbibliothek benötigt, um mit den neuesten Versionen der Unicode-Spezifikation Schritt zu halten.

Abhängigkeit von der Supportbibliothek hinzufügen

Wenn Sie die EmojiCompat-Unterstützungsbibliothek verwenden möchten, müssen Sie die ClassPath-Abhängigkeiten Ihres App-Projekts in Ihrer Entwicklungsumgebung ändern.

So fügen Sie Ihrem Anwendungsprojekt eine Supportbibliothek hinzu:

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

Groovy

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 die Schriftart zu laden. Da die Initialisierung einige Zeit dauern kann, wird sie in einem Hintergrund-Thread ausgeführt.

So initialisieren Sie EmojiCompat mit der herunterladbaren Schriftkonfiguration:

  1. Erstellen Sie eine Instanz der Klasse FontRequest und geben Sie die Autorität des Schriftanbieters, das Paket des Schriftanbieters, die Schriftabfrage und eine Liste von Hash-Sätzen für das Zertifikat an. Weitere Informationen zu FontRequest finden Sie im Abschnitt Herunterladbare Schriftarten programmatisch verwenden der Dokumentation zu Herunterladbare Schriftarten.
  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. Verwenden Sie 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 Schriftkonfiguration 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-Widget-Implementierungen, um EmojiCompat mit TextView, EditText und Button zu verwenden.
EmojiCompat
Hauptoberfläche der Supportbibliothek. Er führt alle externen Aufrufe aus und koordiniert sich mit den anderen Teilen des Systems.
EmojiCompat.Config
Konfiguriert die zu erstellende Singleton-Instanz.
EmojiSpan
 Eine ReplacementSpan-Unterklasse, die das Zeichen (die Zeichensequenz) ersetzt und das Schriftzeichen rendert.
EmojiCompat Schriftart
EmojiCompat verwendet eine Schriftart, um Emojis anzuzeigen. Diese Schriftart ist eine modifizierte Version der Android-Emoji-Schriftart. Die Schriftart wird so geändert:
  • Für die Abwärtskompatibilität beim Rendern von Emojis werden alle Emoji-Zeichen mit einem einzelnen Unicode-Codepunkt im Supplemental Private Use Area-A von Unicode dargestellt, beginnend mit U+F0001.
  • Zusätzliche Emoji-Metadaten werden in einem Binärformat in die Schriftart eingefügt und bei der Laufzeit von EmojiCompat geparst. Die Daten sind in der meta-Tabelle der Schriftart mit dem privaten Tag Emji eingebettet.

Konfigurationsoptionen

Mit der EmojiCompat-Instanz 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(), um einen Initialisierungs-Callback zu registrieren. 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 EmojiCompat.InitCallback-Klasse. Wenn die Initialisierung der EmojiCompat-Unterstützungsbibliothek erfolgreich war, ruft die EmojiCompat-Klasse die Methode onInitialized() auf. Wenn die Bibliothek nicht initialisiert werden kann, ruft die EmojiCompat-Klasse die Methode onFailed() auf.

Wenn Sie den Initialisierungsstatus jederzeit prüfen möchten, rufen Sie die Methode getLoadState() auf. Es wird einer der folgenden Werte zurückgegeben: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED oder LOAD_STATE_FAILED.

EmojiCompat mit AppCompat-Widgets verwenden

Wenn Sie AppCompat widgets verwenden, können Sie EmojiCompat-Widgets verwenden, die von AppCompat widgets abgeleitet sind.

  1. Fügen Sie die Supportbibliothek dem Abschnitt „Abhängigkeiten“ hinzu.

    Groovy

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

    Kotlin

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

    Groovy

          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"/>
    

Konfiguration der bereitgestellten Schriftarten

Die EmojiCompat-Unterstützungsbibliothek ist auch als Paket mit Fonts verfügbar. Dieses Paket enthält die Schriftart mit den eingebetteten Metadaten. Das Paket enthält außerdem eine BundledEmojiCompatConfig, mit der die Metadaten und Schriftarten über die AssetManager geladen werden.

Hinweis:Die Größe der Schrift wird in mehreren Megabyte angegeben.

Abhängigkeit von der Supportbibliothek hinzufügen

Wenn Sie die EmojiCompat-Unterstützungsbibliothek mit der bereitgestellten Schriftkonfiguration verwenden möchten, müssen Sie die Pfadabhängigkeiten Ihres App-Projekts in Ihrer Entwicklungsumgebung ändern.

So fügen Sie Ihrem Anwendungsprojekt eine Supportbibliothek hinzu:

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

Groovy

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

Kotlin

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

Mithilfe von bereitgestellten Schriftarten EmojiCompat konfigurieren

So konfigurierst du EmojiCompat mithilfe von bereitgestellten Schriftarten:

  1. Verwenden Sie BundledEmojiCompatConfig, um eine Instanz von EmojiCompat zu erstellen, und geben Sie eine Instanz von Context an.
  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 jede CharSequence in Spanned-Instanzen mit EmojiSpans umgewandelt werden. Die Klasse EmojiCompat bietet eine Methode, mit der CharSequences-Objekte mit EmojiSpans in Spanned-Instanzen umgewandelt werden können. Mit dieser Methode können Sie die verarbeiteten Instanzen anstelle des Rohstrings verarbeiten und im Cache speichern, was die Leistung Ihrer Anwendung verbessert.

Kotlin

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

Java

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

EmojiCompat für Eingabemethoden verwenden

Mithilfe der EmojiCompat-Unterstützungsbibliothek können Tastaturen die Emojis rendern, die von der Anwendung unterstützt werden, mit der sie interagieren. Mit der Methode hasEmojiGlyph() können IMEs prüfen, ob EmojiCompat ein Emoji rendern kann. Diese Methode nimmt eine CharSequence eines Emojis als Eingabe und gibt true zurück, wenn EmojiCompat das Emoji erkennen und rendern kann.

Die Tastatur kann auch die Version der EmojiCompat-Unterstützungsbibliothek prüfen, die von der App unterstützt wird, um zu bestimmen, welche Emojis in der Palette gerendert werden sollen. Um die Version zu prüfen, muss die Tastatur prüfen, ob die folgenden Tasten im EditorInfo.extras-Bundle vorhanden sind:

Nachdem die Tastatur die Schlüssel im EditorInfo.extras-Bundle erhalten hat, kann sie die Methode hasEmojiGlyph() 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 process()-Methode verwenden, um die CharSequence in Ihrer App vorzuverarbeiten und sie jedem Widget hinzuzufügen, das Spanned-Instanzen rendern kann, z. B. TextView. Außerdem bietet EmojiCompat die folgenden Widget-Hilfsklassen, mit denen Sie Ihre benutzerdefinierten Widgets mit minimalem Aufwand um Emoji-Unterstützung ergänzen können.

Beispiel für TextView

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 Schriftartendownload?
  • Die Emoji-Schriftarten werden bei der ersten Anfrage heruntergeladen, wenn sie nicht auf dem Gerät vorhanden sind. Die Planung des Downloads ist für die App transparent.

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

  • Wie viel Arbeitsspeicher belegt die EmojiCompat-Unterstützungsbibliothek?
  • Derzeit 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 hinzufüge, auf denen Android 4.4 (API-Level 19) oder niedriger ausgeführt wird?
  • Sie können die EmojiCompat Supportbibliothek oder ihre Widgets in Ihre Anwendungen einbinden, die Geräte mit Android 4.4 (API-Level 19) oder niedriger unterstützen. Wenn auf einem Gerät jedoch eine Android-Version vor API-Level 19 ausgeführt wird, befinden sich EmojiCompat und seine Widgets im Status „Kein Betrieb“. Das bedeutet, dass sich EmojiTextView genau wie ein normaler TextView verhält. EmojiCompat-Instanz; sie wechselt sofort in den Status LOAD_STATE_SUCCEEDED, wenn Sie die Methode init() aufrufen.

Weitere Informationen

Weitere Informationen zur Verwendung der EmojiCompat-Bibliothek finden Sie im Video EmojiCompat.