Korzystaj z nowoczesnych emotikonów

Standardowy zestaw emotikonów jest co roku odświeżany przez Unicode, ponieważ liczba emotikonów w przypadku wszystkich typów aplikacji rośnie bardzo szybko.

Jeśli aplikacja wyświetla treści internetowe lub umożliwia wpisywanie tekstu, zdecydowanie zalecamy obsługę najnowszych czcionek emotikonów. W przeciwnym razie później emotikony mogą być wyświetlane w postaci małego kwadratowego pola o nazwie tofu (☐) lub w innej nieprawidłowo renderowanej sekwencji emotikonów.

Na urządzeniach z Androidem w wersji 11 (poziom interfejsu API 30) i starszych nie można aktualizować czcionki emotikonów, dlatego aplikacje, które wyświetlają te emotikony w tych wersjach, należy aktualizować ręcznie.

Oto przykłady nowoczesnych emotikonów.

Przykłady Wersja
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0 (wrzesień 2021 r.)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (wrzesień 2020 r.)
🥲 🥷🏿 🐻‍❄️ 13.0 (marzec 2020 r.)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (październik 2019 r.)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (luty 2019 r.)

Biblioteka androidx.emoji2:emoji2 zapewnia prostszą zgodność wsteczną z starszymi wersjami Androida. Biblioteka emoji2 zależy od biblioteki AppCompat i nie wymaga dalszej konfiguracji.

Obsługa emotikonów w funkcji tworzenia wiadomości

BOM w marcu 2023 r. (Interfejs tworzenia wiadomości 1.4) zapewnia obsługę najnowszej wersji emotikonów, w tym zgodność wsteczną ze starszymi wersjami Androida, aż do interfejsu API 21. Z tego artykułu dowiesz się, jak skonfigurować nowoczesne emotikony w systemie widoków. Więcej informacji znajdziesz na stronie Emotikony podczas tworzenia wiadomości.

Wymagania wstępne

Aby sprawdzić, czy aplikacja prawidłowo wyświetla nowsze emotikony, uruchom ją na urządzeniu z Androidem 10 (poziom interfejsu API 29) lub niższym. Na tej stronie znajdziesz nowoczesne emotikony, które możesz wyświetlić w ramach testów.

Używaj AppCompat do obsługi najnowszych emotikonów

AppCompat 1.4 zapewnia obsługę emotikonów.

Aby używać emotikona AppCompat do obsługi emotikonów, wykonaj te czynności:

  1. Sprawdź, czy moduł zależy od biblioteki AppCompat w wersji 1.4.0-alfa01 lub nowszej.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. Upewnij się, że wszystkie działania, które wyświetlają tekst, rozszerzają klasę AppCompatActivity.

    Kotlin

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

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
    
  3. Przetestuj integrację, uruchamiając aplikację na urządzeniu z Androidem 10 lub starszym i wyświetlając poniższy ciąg testowy. Sprawdź, czy wszystkie znaki są renderowane prawidłowo.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 znikną️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 ☕️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

Twoja aplikacja automatycznie wyświetla zgodne wstecznie emotikony na wszystkich urządzeniach, które oferują do pobrania dostawcę czcionek zgodną z emoji2, takich jak urządzenia z Usługami Google Play.

Jeśli Twoja aplikacja korzysta z AppCompat, ale wyświetla tofu (☐)

W niektórych przypadkach aplikacja może wyświetlać tofu zamiast odpowiedniego emotikona, nawet jeśli dodasz bibliotekę AppCompat. Poniżej znajdziesz możliwe wyjaśnienia i rozwiązania.

Korzystasz z aplikacji na urządzeniu, na którym ostatnio zainstalowano aplikację lub w nowym emulatorze.

Wyczyść dane Usług Google Play aplikacji, aby wyczyścić pamięć podręczną czcionki, która mogła wystąpić podczas uruchamiania. Zazwyczaj rozwiązuje to problem po kilku godzinach.

Aby wyczyścić dane aplikacji:

  1. Otwórz Ustawienia w urządzeniu z systemem Android.

  2. Kliknij Aplikacje i powiadomienia.

  3. Kliknij Wyświetl wszystkie aplikacje lub Informacje o aplikacji.

  4. Przewiń listę aplikacji i kliknij Usługi Google Play.

  5. Kliknij Pamięć urządzenia i pamięć podręczna.

  6. Kliknij Wyczyść pamięć podręczną.

Twoja aplikacja nie korzysta z klasy związanej z tekstem AppCompat

Może się tak zdarzyć, jeśli nie rozszerzysz interfejsu AppCompatActivity lub utworzysz instancję widoku w kodzie, np. TextView. Sprawdź, czy:

  • Zakres aktywności obejmuje AppCompatActivity.
  • Jeśli tworzysz widok w kodzie, użyj poprawnej podklasy AppCompat.

Podczas rozszerzania pliku XML AppCompatActivity automatycznie uzupełnia wartość AppCompatTextView zamiast TextView, więc nie musisz aktualizować kodu XML.

Telefon testowy nie obsługuje czcionek do pobrania

Sprawdź, czy DefaultEmojiCompatConfig.create zwraca konfigurację niepustą.

Emulator na wcześniejszym poziomie interfejsu API nie uaktualnił Usług Google Play

Jeśli używasz emulatora na wcześniejszym poziomie interfejsu API, konieczne może być zaktualizowanie pakietu Usług Google Play dla emoji2, aby znaleźć dostawcę czcionek. Aby to zrobić, zaloguj się w Sklepie Google Play w emulatorze.

Aby sprawdzić, czy zainstalowana jest zgodna wersja, wykonaj te czynności:

  1. Uruchom to polecenie:

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. Sprawdź, czy versionCode ma wartość większą niż 211200000.

Obsługuj emotikony bez użycia aplikacji AppCompat

Jeśli Twoja aplikacja nie może zawierać AppCompat, może używać bezpośrednio emoji2. Wymaga to więcej pracy, więc używaj tej metody tylko wtedy, gdy aplikacja nie może korzystać z AppCompat.

Aby obsługiwać emotikony bez biblioteki AppCompat, wykonaj te czynności:

  1. W pliku build.gradle aplikacji umieść emoji2 i emoji2-views.

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

    Moduł emoji2-views zawiera podklasy TextView, Button i EditText, które implementują EmojiCompat. Nie używaj go w aplikacji, która zawiera dyrektywę AppCompat, ponieważ zawiera ona już dyrektywę EmojiCompat.

  2. W pliku XML i kodzie tam, gdzie używasz właściwości TextView, EditText lub Button, użyj zamiast tego kodu EmojiTextView, EmojiEditText lub EmojiButton.

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

    Gdy dołączysz moduł emoji2, system użyje domyślnego dostawcy czcionek do pobrania, aby automatycznie wczytać czcionkę z emotikonami wkrótce po uruchomieniu aplikacji. Nie jest potrzebna dodatkowa konfiguracja.

  3. Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 11 lub starszym i wyświetl te ciągi testowe. Sprawdź, czy wszystkie znaki są renderowane prawidłowo.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 znikną️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 ☕️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

Używaj emojiCompat bez widżetów

Do renderowania prawidłowych obrazów EmojiCompat używa interfejsu EmojiSpan. Dlatego musi przekonwertować dowolny obiekt CharSequence na obiekt Spanned z obiektami EmojiSpan. Klasa emojiCompat udostępnia metodę process() do konwersji CharSequences na wystąpienia Spanned. Korzystając z tej metody, możesz wywołać process() w tle i zapisać wyniki w pamięci podręcznej, co zwiększa wydajność aplikacji.

Kotlin

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

Java

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

Korzystanie z Emotikonów w edytorach metod wprowadzania

Klasa EmojiCompat pozwala klawiaturom renderować emotikony obsługiwane przez aplikację, z której korzystają. Edytorzy metod wprowadzania (IME) mogą używać metody getEmojiMatch() do sprawdzania, czy instancja EmojiCompat może renderować emotikon. Ta metoda pobiera CharSequence emotikona i zwraca true, jeśli EmojiCompat może go wykryć i wyrenderować.

Klawiatura może też sprawdzić wersję EmojiCompat obsługiwaną przez aplikację, by określić, który emotikon ma zostać wyświetlony w palecie. Aby sprawdzić wersję (jeśli jest dostępna), klawiatura może wyszukać te klawisze w pakiecie EditorInfo.extras:

  • EDITOR_INFO_METAVERSION_KEY: reprezentuje wersję metadanych emotikonu, z której korzysta aplikacja. Jeśli ten klucz nie istnieje, oznacza to, że aplikacja nie korzysta z EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: jeśli klucz istnieje i jest ustawiony na true, aplikacja skonfiguruje funkcję EmojiCompat tak, aby zastąpić wszystkie emotikony, nawet jeśli znajdują się one w systemie.

Dowiedz się więcej o konfigurowaniu wystąpienia EmojiCompat.

Używanie emotikonów w widokach niestandardowych

Jeśli Twoja aplikacja ma widoki niestandardowe, które są bezpośrednimi lub pośrednimi podklasami TextView – np. Button, Switch lub EditText – i mogą wyświetlać treści użytkowników, każdy z nich musi obsługiwać EmojiCompat.

Ten proces różni się w zależności od tego, czy aplikacja używa biblioteki AppCompat.

Dodawanie widoków niestandardowych dla aplikacji za pomocą AppCompat

Jeśli Twoja aplikacja używa AppCompat, rozszerz implementację AppCompat zamiast implementacji platformy. Aby dowiedzieć się, jak rozszerzyć widoki w AppCompat, skorzystaj z tej tabeli:

Zamiast przedłużać... Przedłuż
TextView AppCompatTextView
EditText AppCompatEditText
ToggleButton AppCompatToggleButton
Switch SwitchCompat
Button AppCompatButton
CheckedTextView AppCompatCheckedTextView
RadioButton AppCompatRadioButton
CheckBox AppCompatCheckBox
AutoCompleteTextView AppCompatAutoCompleteTextView
MultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView

Dodawanie widoków niestandardowych dla aplikacji bez AppCompat

Jeśli Twoja aplikacja nie używa AppCompat, użyj w module emoji2-views-helper pomocników integracji widoków, które zostały zaprojektowane do użytku w widokach niestandardowych. To narzędzia, z których biblioteka AppCompat może wdrożyć obsługę emotikonów.

Aby zapewnić obsługę widoków niestandardowych w przypadku aplikacji, które nie korzystają z AppCompat:

  1. Dodaj bibliotekę emoji2-views-helper:

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. Postępuj zgodnie z instrukcjami, aby dodać EmojiTextViewHelper lub EmojiEditTextHelper do widoków niestandardowych aplikacji.

  3. Przetestuj integrację, uruchamiając aplikację na urządzeniu z Androidem 10 lub starszym i wyświetlając poniższy ciąg testowy. Sprawdź, czy wszystkie znaki są renderowane prawidłowo.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 znikną️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 ☕️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

Opcjonalne funkcje obsługi emotikona2

Po dodaniu biblioteki emoji2 do aplikacji możesz dodać funkcje opisane w tej sekcji.

Skonfiguruj emotikon2, aby użyć innej czcionki lub innego dostawcy czcionek do pobrania

Aby skonfigurować emoji2 do korzystania z innego lub innego dostawcy czcionek do pobrania, wykonaj te czynności:

  1. Wyłącz EmojiCompatInitializer, dodając do pliku manifestu ten kod:

    <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. Wykonać jedną z tych czynności:

Modyfikowanie działania aplikacji emojiCompat

Aby zmienić działanie EmojiCompat, możesz użyć instancji EmojiCompat.Config.

Najważniejsza opcja konfiguracji to setMetadataLoadStrategy(), która określa, kiedy EmojiCompat wczytuje czcionkę. Wczytywanie czcionek rozpocznie się zaraz po wywołaniu funkcji EmojiCompat.load() i spowoduje to pobranie wszelkich niezbędnych plików. System utworzy wątek do pobrania czcionek, chyba że aplikacja go udostępni.

LOAD_STRATEGY_MANUAL umożliwia kontrolowanie, kiedy wywoływana jest metoda EmojiCompat.load(), a LOAD_STRATEGY_DEFAULT umożliwia synchroniczne uruchamianie wczytywania w wywołaniu funkcji EmojiCompat.init().

Większość aplikacji używa funkcji LOAD_STRATEGY_MANUAL, aby kontrolować wątek i czas wczytywania czcionek. Aplikacja musi opóźnić się do momentu wyświetlenia pierwszego ekranu, aby uniknąć opóźnienia uruchamiania. EmojiCompatInitializer wykonuje tę procedurę i opóźnia wczytywanie czcionki z emotikonami do czasu wznowienia pierwszego ekranu.

Aby ustawić inne aspekty konfiguracji, użyj tych metod klasy podstawowej:

  • setReplaceAll(): określa, czy EmojiCompat zastępuje wszystkie znalezione emotikony wystąpieniami EmojiSpan. Domyślnie, gdy EmojiCompat określi, że system może wyrenderować emotikon, nie zastępuje tego emotikona. Gdy ustawiona jest wartość true, EmojiCompat zastępuje wszystkie emotikony obiektami EmojiSpan.
  • setEmojiSpanIndicatorEnabled(): wskazuje, czy EmojiCompat zastępuje emotikon obiektem EmojiSpan. Gdy ustawisz wartość true, EmojiCompat będzie rysować tło dla: EmojiSpan. Ta metoda jest używana głównie do debugowania.
  • setEmojiSpanIndicatorColor: ustawia kolor EmojiSpan. Wartością domyślną jest GREEN.
  • registerInitCallback(): informuje aplikację o stanie inicjowania EmojiCompat.

Dodaj detektory inicjowania

Klasy EmojiCompat i EmojiCompat.Config udostępniają metody registerInitCallback() i unregisterInitCallback() służące do rejestrowania i wyrejestrowania wywołań zwrotnych inicjowania. Aplikacja używa tych wywołań zwrotnych, aby zaczekać na zainicjowanie funkcji EmojiCompat, zanim przetworzy emotikony w wątku w tle lub w widoku niestandardowym.

Aby użyć tych metod, utwórz instancję klasy EmojiCompat.InitCallback. Wywołaj te metody i przekaż je w instancji klasy EmojiCompat.InitCallback. Jeśli inicjowanie się uda, klasa EmojiCompat wywołuje metodę onInitialized(). Jeśli nie uda się zainicjować biblioteki, klasa EmojiCompat wywołuje metodę onFailed().

Aby w dowolnym momencie sprawdzić stan inicjowania, wywołaj metodę getLoadState(). Ta metoda zwraca jedną z tych wartości: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED lub LOAD_STATE_FAILED.

Obsługa pakietów czcionek za pomocą emotikon2

Za pomocą artefaktu emoji2-bundled możesz połączyć czcionkę z emotikonami w swojej aplikacji. Rozmiar czcionki NotoColorEmoji przekracza jednak 10 MB, dlatego w miarę możliwości zalecamy korzystanie z czcionek do pobrania w aplikacji. Artefakt emoji2-bundled jest przeznaczony dla aplikacji na urządzenia, które nie obsługują czcionek dostępnych do pobrania.

Aby użyć artefaktu emoji2-bundled:

  1. Uwzględnij artefakty emoji2-bundled i emoji2:

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. Skonfiguruj emoji2 tak, aby korzystała z połączonej konfiguracji:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))
    

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
    
  3. Przetestuj integrację, wykonując poprzednie kroki pozwalające dodać emojicompat z AppCompat lub bez niego. Sprawdź, czy ciąg testowy wyświetla się poprawnie.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 znikną️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 ☕️
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

Wpływ automatycznej konfiguracji emojiCompat

System stosuje konfigurację domyślną z użyciem biblioteki startowej EmojiCompatInitializer i DefaultEmojiCompatConfig.

Gdy pierwsze działanie zostanie wznowione w aplikacji, inicjator zaplanuje wczytywanie czcionek emotikonów. Dzięki temu krótkiemu opóźnieniu aplikacja może wyświetlić początkową treść bez potencjalnych opóźnień spowodowanych wczytywaniem czcionki w wątku w tle.

DefaultEmojiCompatConfig szuka zainstalowanego w systemie dostawcy czcionek do pobrania, który implementuje interfejs EmojiCompat, np. Usługi Google Play. Na urządzeniach z Usługami Google Play czcionka jest wczytywana przy użyciu tych usług.

Inicjator tworzy wątek w tle, aby wczytać czcionkę z emotikonami, a pobranie czcionki może potrwać do 10 sekund. Po pobraniu czcionki w wątku w tle zainicjowanie funkcji EmojiCompat zajmuje około 150 milisekund.

Odłóż inicjalizację EmojiCompat, nawet jeśli wyłączysz EmojiCompatInitializer. Jeśli ręcznie skonfigurujesz EmojiCompat, wywołaj EmojiCompat.load() po wyświetleniu pierwszego ekranu aplikacji, aby uniknąć rywalizacji w tle przy pierwszym wczytywaniu ekranu.

Po załadowaniu EmojiCompat wykorzystuje około 300 KB pamięci RAM na metadane emotikonów.