Emoji-Kompatibilität

Ziel der EmojiCompat-Supportbibliothek ist es, Android-Geräten mit den neuesten Emojis auf dem neuesten Stand zu halten. Dadurch wird verhindert, dass in deiner App fehlende Emoji-Zeichen im Format XXXXX angezeigt werden. Das bedeutet, dass dein Gerät keine Schriftart zur Darstellung des Texts hat. Wenn du die EmojiCompat-Supportbibliothek verwendest, müssen deine App-Nutzer nicht auf Android-Updates 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 Ressourcen:

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

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. Du kannst EmojiCompat entweder mit gebündelten 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 Prozess.

EmojiCompat-Prozess
Abbildung 2: EmojiCompat-Prozess

Konfiguration für herunterladbare Schriftarten

Bei der Konfiguration für herunterladbare Schriftarten wird die Funktion der Supportbibliothek für 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 Supportbibliotheken hinzufügen

Damit Sie die EmojiCompat-Supportbibliothek verwenden können, müssen Sie die Klassenpfadabhängigkeiten Ihres App-Projekts 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.

Groovig

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

Kotlin

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

Konfiguration der herunterladbaren Schriftart wird initialisiert

Sie müssen EmojiCompat initialisieren, um die Metadaten und das Schriftbild zu laden. Da die Initialisierung einige Zeit dauern kann, wird sie in 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. 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 zur Konfiguration von EmojiCompat mit der herunterladbaren Schriftartkonfiguration finden Sie in der Beispiel-App für die Emoji-Kompatibilität Java | Kotlin.

Bibliothekskomponenten

Bibliothekskomponenten im EmojiCompat-Prozess
Abbildung 3: Bibliothekskomponenten im EmojiCompat-Prozess
Widgets: EmojiEditText, EmojiTextView, EmojiButton
Standard-Widget-Implementierungen zur Verwendung von EmojiCompat mit TextView, EditText und Button.
EmojiCompat
Öffentliche Hauptoberfläche für die Support Library. Sie führt alle externen Aufrufe aus und koordiniert mit den anderen Teilen des Systems.
EmojiCompat.Config
Konfiguriert die zu erstellende Singleton-Instanz.
EmojiSpan
: Eine ReplacementSpan-Unterklasse, die das Zeichen (Sequenzen) ersetzt und das Symbol rendert.
Schriftart EmojiCompat
EmojiCompat verwendet eine Schriftart zum Anzeigen von Emojis. Diese Schriftart ist eine modifizierte Version der Emoji-Schriftart unter Android. Die Schriftart wird so geändert:
  • Damit Emoji-Zeichen abwärtskompatibel sind, werden alle Emoji-Zeichen mit einem einzigen Unicode-Codepunkt im zusätzlichen privaten Nutzungsbereich-A von Unicode dargestellt, beginnend mit U+F0001.
  • Zusätzliche Emoji-Metadaten werden im 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

Sie können die Instanz EmojiCompat verwenden, um das Verhalten von EmojiCompat zu ä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 stellen die Methoden registerInitCallback() und unregisterInitCallback() bereit, um einen Initialisierungs-Callback zu registrieren. 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. 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.

Mit der Methode getLoadState() lässt sich jederzeit der Initialisierungsstatus prüfen. Sie gibt einen der folgenden Werte zurück: 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 aus erweitert werden.

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

    Groovig

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

    Kotlin

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

    Groovig

          dependencies {
              implementation "androidx.emoji:emoji-appcompat:$version"
          }
          
  2. Verwenden Sie 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 gebündelter Schriftarten

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 AssetManager verwendet, um die Metadaten und Schriftarten zu laden.

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

Abhängigkeit von Supportbibliotheken hinzufügen

Damit Sie die EmojiCompat-Supportbibliothek mit der Konfiguration gebündelter Schriftarten verwenden können, müssen Sie die Klassenpfadabhängigkeiten des App-Projekts 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.

Groovig

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

Führe die folgenden Schritte aus, um EmojiCompat mit gebündelten Schriftarten zu konfigurieren:

  1. Verwenden Sie BundledEmojiCompatConfig, um eine Instanz von EmojiCompat zu erstellen und eine Instanz von Context bereitzustellen.
  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 konvertiert werden. 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, 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 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 Emojis rendern kann. Diese Methode verwendet die 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 festzustellen, welche Emojis in der Palette gerendert werden sollen. Zum Prüfen der Version (falls verfügbar) muss die Tastatur prüfen, ob die folgenden Tasten im EditorInfo.extras-Bundle vorhanden sind:

Nachdem die Schlüssel im EditorInfo.extras-Bundle empfangen wurden, kann die Tastatur mit der Methode hasEmojiGlyph() prüfen, ob die App ein bestimmtes Emoji rendern kann. Dabei ist metadataVersion der Wert für EDITOR_INFO_METAVERSION_KEY.

EmojiCompat mit benutzerdefinierten Widgets verwenden

Sie können jederzeit die Methode process() verwenden, um das CharSequence in Ihrer Anwendung vorzuverarbeiten und es jedem Widget hinzuzufügen, das Spanned-Instanzen rendern kann, z. B. TextView. Darüber hinaus bietet EmojiCompat die folgenden Widget-Hilfsklassen, mit denen Sie Ihre benutzerdefinierten Widgets mit minimalem Aufwand mit Emoji-Unterstützung anreichern 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 Bearbeitungstext

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 von Schriftarten?
  • Die Emoji-Schriftarten werden auf die erste Anfrage heruntergeladen, wenn sie nicht auf dem Gerät vorhanden sind. Die Downloadplanung ist für die App transparent.

  • Wie lange dauert die Initialisierung?
  • Nachdem die Schriftart heruntergeladen wurde, dauert es etwa 150 Millisekunden, EmojiCompat zu initialisieren.

  • Wie viel Speicher verwendet die EmojiCompat-Bibliothek?
  • Derzeit ist die Datenstruktur, mit der das Emoji gefunden wird, in den Arbeitsspeicher der Anwendung geladen und belegt ca. 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 zu konvertieren. 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 deren Widgets in deine Apps einbinden, die Geräte mit Android 4.4 (API-Level 19) oder niedriger unterstützen. Wird auf einem Gerät jedoch eine Android-Version vor API-Level 19 ausgeführt, befinden sich EmojiCompat und die zugehörigen Widgets im Zustand „Kein Vorgang“. Das bedeutet, dass sich EmojiTextView genau wie eine reguläre TextView verhält. EmojiCompat-Instanz. Sie wechselt sofort in den Status LOAD_STATE_SUCCEEDED, wenn Sie die Methode init() aufrufen.

Weitere Informationen

Wenn Sie weitere Informationen zur Verwendung der EmojiCompat-Bibliothek erhalten möchten, sehen Sie sich EmojiCompat an.