Korzystaj z nowoczesnych emotikonów

Wypróbuj Compose
Jetpack Compose to zalecany zestaw narzędzi do tworzenia interfejsu na Androida. Dowiedz się, jak obsługiwać emotikony w Compose.

Standardowy zestaw emotikonów jest co roku odświeżany przez Unicode, ponieważ ich użycie we wszystkich typach aplikacji szybko rośnie.

Jeśli Twoja aplikacja wyświetla treści z internetu lub umożliwia wprowadzanie tekstu, zdecydowanie zalecamy obsługę najnowszych czcionek emotikonów. W przeciwnym razie nowsze emotikony mogą być wyświetlane jako małe kwadratowe pole o nazwie tofu (☐) lub inne nieprawidłowo renderowane sekwencje emotikonów.

Wersje Androida 11 (poziom API 30) i starsze nie mogą aktualizować czcionki emotikonów, więc aplikacje, które wyświetlają je w tych wersjach, muszą być aktualizowane ręcznie.

Poniżej znajdziesz przykłady nowoczesnych emotikonów.

Przykłady Wersja
🫩 🪉 🇨🇶 16.0 (wrzesień 2024 r.)
🐦‍🔥 🧑‍🧑‍🧒‍🧒 👩🏽‍🦽‍➡️ 🇲🇶 15.1 (wrzesień 2023 r.)
🩷 🫸🏼 🐦‍⬛ 15.0 (wrzesień 2022 r.)
🫠 🫱🏼‍🫲🏿 🫰🏽 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ą ze starszymi wersjami Androida. Biblioteka emoji2 jest zależnością biblioteki AppCompat i nie wymaga dalszej konfiguracji.

Obsługa emotikonów w funkcji Pomóż mi pisać

BOM z marca 2023 r. (Compose UI 1.4) obsługuje najnowszą wersję emotikonów, w tym zgodność wsteczną ze starszymi wersjami Androida do poziomu API 21. Na tej stronie dowiesz się, jak skonfigurować współczesne emotikony w systemie widoku. Więcej informacji znajdziesz na stronie Emotikony w Compose.

Wymagania wstępne

Aby sprawdzić, czy aplikacja prawidłowo wyświetla nowsze emotikony, uruchom ją na urządzeniu z Androidem 10 (poziom API 29) lub starszym. Ta strona zawiera nowoczesne emotikony, które możesz wyświetlić w celu przetestowania.

Obsługa najnowszych emotikonów za pomocą AppCompat

AppCompat 1.4 obsługuje emotikony.

Aby używać AppCompat do obsługi emotikonów:

  1. Sprawdź, czy moduł jest zależny od biblioteki AppCompat w wersji 1.4.0-alpha01 lub nowszej.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. Upewnij się, że wszystkie aktywności, 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 ten ciąg testowy. Upewnij się, że wszystkie znaki są prawidłowo renderowane.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Aplikacja automatycznie wyświetla zgodne wstecznie emotikony na wszystkich urządzeniach, które udostępniają dostawcę czcionek do pobrania zgodnego z emoji2, np. na urządzeniach z Usługami Google Play.

Jeśli aplikacja używa AppCompat, ale wyświetla tofu (☐)

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

uruchamiasz aplikację na urządzeniu, na którym niedawno zainstalowano nowy system, lub w nowym emulatorze;

Wyczyść dane usług Google Play w aplikacji, aby usunąć pamięć podręczną czcionek, która może być tworzona podczas uruchamiania. Zwykle rozwiązuje to problem po kilku godzinach.

Aby wyczyścić dane aplikacji:

  1. Na urządzeniu z Androidem otwórz Ustawienia.

  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ęć wewnętrzna i podręczna.

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

Twoja aplikacja nie używa klasy AppCompat związanej z tekstem

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

  • Aktywność rozszerza AppCompatActivity.
  • Jeśli tworzysz widok w kodzie, użyj odpowiedniej podklasy AppCompat.

AppCompatActivity automatycznie rozszerza AppCompatTextView zamiast TextView podczas rozszerzania kodu XML, więc nie musisz aktualizować kodu XML.

Telefon testowy nie obsługuje czcionek do pobrania

Sprawdź, czy DefaultEmojiCompatConfig.create zwraca konfigurację inną niż null.

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

Jeśli używasz emulatora na wcześniejszym poziomie interfejsu API, może być konieczne zaktualizowanie dołączonych Usług Google Play, aby aplikacja emoji2 mogła 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 jest wyższa niż 211200000.

Obsługa emotikonów bez AppCompat

Jeśli Twoja aplikacja nie może zawierać AppCompat, może bezpośrednio używać 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 uwzględnij 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 udostępnia podklasy TextView, Button i EditText, które implementują EmojiCompat. Nie używaj go w aplikacji, która zawiera AppCompat, ponieważ ma ona już zaimplementowany EmojiCompat.

  2. W kodzie XML i kodzie – wszędzie tam, gdzie używasz TextView, EditText lub Button – użyj zamiast tego EmojiTextView, EmojiEditText lub EmojiButton.

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

    Dzięki modułowi emoji2 system używa domyślnego dostawcy czcionek do pobrania, aby automatycznie wczytać czcionkę emotikonów krótko po uruchomieniu aplikacji. Nie jest wymagana żadna dodatkowa konfiguracja.

  3. Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 11 lub starszym, na którym wyświetlają się te ciągi testowe. Upewnij się, że wszystkie znaki są prawidłowo renderowane.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Używanie EmojiCompat bez widżetów

EmojiCompat używa EmojiSpan do renderowania prawidłowych obrazów. Dlatego musi przekonwertować dany obiekt CharSequence na obiekt Spanned z obiektami EmojiSpan. Klasa EmojiCompat udostępnia metodę process() do konwertowania CharSequences na instancje Spanned. Za pomocą tej metody możesz wywołać process() w tle i zapisać wyniki w pamięci podręcznej, co poprawi wydajność aplikacji.

Kotlin

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

Java

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

Używanie EmojiCompat w edytorach metod wprowadzania

Klasa EmojiCompat umożliwia klawiaturom renderowanie emotikonów obsługiwanych przez aplikację, z którą wchodzą w interakcję. Edytory metod wprowadzania (IME) mogą używać metody getEmojiMatch(), aby sprawdzić, czy instancja EmojiCompat może renderować emotikon. Ta metoda przyjmuje CharSequence emotikona i zwraca wartość true, jeśli EmojiCompat może wykryć i wyrenderować emotikon.

Klawiatura może też sprawdzać wersję EmojiCompat obsługiwaną przez aplikację, aby określić, które emotikony mają być wyświetlane na palecie. Aby sprawdzić wersję, klawiatura może wyszukać te klucze w pakiecie EditorInfo.extras (jeśli są dostępne):

  • EDITOR_INFO_METAVERSION_KEY: reprezentuje wersję metadanych emotikonów używaną przez aplikację. Jeśli ten klucz nie istnieje, aplikacja nie używa EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: jeśli klucz istnieje i jest ustawiony na true, aplikacja konfiguruje EmojiCompat, aby zastąpić wszystkie emotikony, nawet jeśli są obecne w systemie.

Dowiedz się więcej o konfigurowaniu instancji 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 te widoki mogą wyświetlać treści użytkowników, każdy z nich musi implementować interfejs EmojiCompat.

Proces różni się w zależności od tego, czy aplikacja korzysta z biblioteki AppCompat.

Dodawanie widoków niestandardowych w aplikacjach z AppCompat

Jeśli Twoja aplikacja używa AppCompat, rozszerz implementację AppCompat zamiast implementacji platformy. W tabeli poniżej znajdziesz wskazówki, jak rozszerzyć widoki w AppCompat:

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 w aplikacjach bez AppCompat

Jeśli Twoja aplikacja nie używa AppCompat, użyj pomocników integracji widoku w module emoji2-views-helper, które są przeznaczone do użycia w widokach niestandardowych. Są to funkcje pomocnicze, których biblioteka AppCompat używa do implementacji obsługi emotikonów.

Aby obsługiwać widoki niestandardowe w aplikacjach, które nie korzystają z AppCompat, wykonaj te czynności:

  1. Dodaj bibliotekę emoji2-views-helper:

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. Postępuj zgodnie z instrukcjami, aby uwzględnić EmojiTextViewHelper lub EmojiEditTextHelper w widokach niestandardowych aplikacji.

  3. Przetestuj integrację, uruchamiając aplikację na urządzeniu z Androidem 10 lub starszym i wyświetlając ten ciąg testowy. Upewnij się, że wszystkie znaki są prawidłowo renderowane.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Opcjonalne funkcje obsługi emoji2

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

Skonfiguruj emoji2, aby używać innej czcionki lub dostawcy czcionek do pobrania

Aby skonfigurować emoji2 do używania innej czcionki lub 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. Wykonaj jedną z tych czynności:

Modyfikowanie działania EmojiCompat

Możesz użyć instancji EmojiCompat.Config, aby zmodyfikować działanie EmojiCompat.

Najważniejszą opcją konfiguracji jest setMetadataLoadStrategy(), która określa, kiedy EmojiCompat wczytuje czcionkę. Wczytywanie czcionki rozpoczyna się, gdy tylko zostanie wywołana metoda EmojiCompat.load(), co powoduje uruchomienie wszystkich niezbędnych pobrań. System tworzy wątek do pobierania czcionek, chyba że aplikacja udostępnia własny.

LOAD_STRATEGY_MANUAL pozwala kontrolować, kiedy wywoływana jest metoda EmojiCompat.load(), a LOAD_STRATEGY_DEFAULT sprawia, że wczytywanie rozpoczyna się synchronicznie w wywołaniu metody EmojiCompat.init().

Większość aplikacji używa LOAD_STRATEGY_MANUAL, aby kontrolować wątek i czas wczytywania czcionki. Aplikacja musi odroczyć wyświetlanie reklamy do momentu, gdy pojawi się pierwszy ekran, aby uniknąć opóźnienia podczas uruchamiania. EmojiCompatInitializer stosuje tę praktykę i odracza wczytywanie czcionki emotikonów do momentu wznowienia pierwszego ekranu.

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

  • setReplaceAll(): określa, czy EmojiCompat zastępuje wszystkie znalezione emotikony wystąpieniami EmojiSpan. Domyślnie, gdy EmojiCompat stwierdzi, że system może wyrenderować emotikon, nie zastępuje go. Gdy ustawisz wartość true, EmojiCompat zastąpi 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 wskazujący EmojiSpan. Wartością domyślną jest GREEN.
  • registerInitCallback(): informuje aplikację o stanie inicjowania EmojiCompat.

Dodawanie detektorów inicjowania

Klasy EmojiCompat i EmojiCompat.Config udostępniają metody registerInitCallback() i unregisterInitCallback() do rejestrowania i wyrejestrowywania wywołań zwrotnych inicjowania. Aplikacja używa tych wywołań zwrotnych, aby poczekać na zainicjowanie 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ż instancję klasy EmojiCompat.InitCallback. Po pomyślnym zakończeniu inicjowania 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 czcionek dołączonych do emoji2

Możesz użyć artefaktu emoji2-bundled, aby dołączyć czcionkę emotikonów do aplikacji. Jednak ponieważ czcionka NotoColorEmoji ma ponad 10 MB, zdecydowanie zalecamy, aby aplikacja używała czcionek do pobrania, gdy jest to możliwe. Artefakt emoji2-bundled jest przeznaczony dla aplikacji na urządzeniach, które nie obsługują czcionek do pobrania.

Aby użyć artefaktu emoji2-bundled, wykonaj te czynności:

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

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. Skonfiguruj emoji2, aby używać konfiguracji w pakiecie:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
  3. Przetestuj integrację, wykonując podane wyżej czynności, aby uwzględnić emojicompat z AppCompat lub bez. Sprawdź, czy ciąg testowy wyświetla się prawidłowo.

    • 16.0: 🫩, 🪉, 🇨🇶
    • 15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • 15.0: 🩷, 🫸🏼, 🐦‍⬛
    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

Wpływ automatycznej konfiguracji EmojiCompat

System stosuje domyślną konfigurację, używając biblioteki startowej EmojiCompatInitializer i DefaultEmojiCompatConfig.

Po wznowieniu pierwszej aktywności w aplikacji inicjator planuje wczytanie czcionki emotikonów. To krótkie opóźnienie pozwala aplikacji 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, takiego jak Usługi Google Play. Na urządzeniach z Usługami Google Play czcionka jest wczytywana za pomocą tych usług.

Inicjator tworzy wątek w tle, aby wczytać czcionkę emotikonów. Pobieranie czcionki może potrwać do 10 sekund, zanim upłynie limit czasu. Po pobraniu czcionki inicjowanie EmojiCompat w wątku w tle zajmuje około 150 milisekund.

Opóźnij inicjowanie EmojiCompat, nawet jeśli wyłączysz EmojiCompatInitializer. Jeśli ręcznie konfigurujesz EmojiCompat, wywołaj EmojiCompat.load() po wyświetleniu pierwszego ekranu aplikacji, aby uniknąć rywalizacji w tle z pierwszym wczytywaniem ekranu.

Po wczytaniu EmojiCompat używa około 300 KB pamięci RAM do przechowywania metadanych emotikonów.