Korzystaj z nowoczesnych emotikonów

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

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

Jeśli Twoja aplikacja wyświetla treści internetowe lub umożliwia wprowadzanie tekstu, zdecydowanie zalecamy obsługę najnowszych czcionek emoji. W przeciwnym razie późniejsze emotikony mogą być wyświetlane jako mały kwadratowy blok zwany tofu (☐) lub inne nieprawidłowo renderowane sekwencje emotikonów.

W przypadku Androida w wersji 11 (poziom interfejsu API 30) i starszych nie można zaktualizować czcionki emoji, więc aplikacje, które wyświetlają emotikony w tych wersjach, muszą być aktualizowane ręcznie.

Oto przykłady nowoczesnych emoji.

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 trybie pisania

BOM z marca 2023 r. (Compose UI 1.4) obsługuje najnowszą wersję emoji, w tym wsteczną zgodność ze starszymi wersjami Androida aż do API 21. Na tej stronie dowiesz się, jak skonfigurować nowoczesne emoji w systemie View. Więcej informacji znajdziesz na stronie Emotikony w oknie tworzenia.

Wymagania wstępne

Aby sprawdzić, czy aplikacja prawidłowo wyświetla nowsze emoji, uruchom ją na urządzeniu z Androidem 10 (poziom API 29) lub starszym. Na tej stronie znajdziesz nowoczesne emoji, które możesz wyświetlać w celu testowania.

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

AppCompat Wersja 1.4 obsługuje emotikony.

Aby użyć znaku AppCompat do obsługi emoji:

  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 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 ten ciąg testowy. Sprawdź, czy wszystkie znaki są wyświetlane prawidłowo.

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

Aplikacja automatycznie wyświetla emoji zgodne wstecznie 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 Twoja aplikacja korzysta z AppCompat, ale wyświetla tofu (☐)

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

aplikacja jest uruchomiona na urządzeniu, na którym niedawno zainstalowano oprogramowanie, lub na nowym emulatorze;

Wyczyść dane aplikacji w Usługach Google Play, aby usunąć wszelkie dane czcionek, które mogły zostać zapisane w pamięci podręcznej podczas uruchamiania. Zwykle rozwiązuje to problem po kilku godzinach.

Aby wyczyścić dane aplikacji:

  1. Otwórz Ustawienia na urządzeniu z Androidem.

  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 AppCompatActivity lub utworzysz instancję widoku w kodzie, np. TextView. Sprawdź, czy:

  • Aktywność trwa AppCompatActivity.
  • Jeśli tworzysz widok w kodzie, użyj odpowiedniej AppCompatpodklasy.

AppCompatActivity automatycznie zastępuje AppCompatTextView znakiem TextView podczas wczytywania 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 z wcześniejszym poziomem interfejsu API nie został uaktualniony do Usług Google Play.

Jeśli używasz emulatora z wcześniejszym poziomem interfejsu API, może być konieczne zaktualizowanie dołączonych Usług Google Play, aby emoji2 mógł znaleźć dostawcę czcionek. Aby to zrobić, zaloguj się w Sklepie Google Play na emulatorze.

Aby sprawdzić, czy zainstalowana jest zgodna wersja:

  1. Uruchom to polecenie:

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. Sprawdź, czy wartość versionCode jest większa 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 Twoja aplikacja nie może używać AppCompat.

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

  1. W pliku build.gradle aplikacji umieść emoji2emoji2-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 klas TextView, Button i EditText, które implementują interfejs EmojiCompat. Nie używaj go w aplikacji, która zawiera AppCompat, ponieważ ta usługa już implementuje EmojiCompat.

  2. W kodzie XML i w innych miejscach, w których używasz znaków TextView, EditText lub Button, używaj zamiast nich znaków EmojiTextView, EmojiEditText lub EmojiButton.

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

    Dzięki uwzględnieniu modułu emoji2 system używa domyślnego dostawcy czcionek do pobrania, aby automatycznie wczytać czcionkę emoji krótko po uruchomieniu aplikacji. Nie wymaga to dalszej konfiguracji.

  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ą wyświetlane prawidłowo.

    • 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ć dowolny obiekt CharSequence na obiekt Spanned z obiektami EmojiSpan. Klasa EmojiCompat udostępnia metodę process(), która przekształca CharSequences w instancje Spanned. Dzięki tej metodzie możesz wywoływać funkcję process() w tle i buforować wyniki, 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");

Używanie biblioteki EmojiCompat w edytorach metod wprowadzania

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

Klawiatura może też sprawdzić, jaką wersję EmojiCompat obsługuje aplikacja, aby określić, które emoji mają być wyświetlane na palecie. Aby sprawdzić wersję, klawiatura może wyszukać te klucze w pakiecie EditorInfo.extras:

  • EDITOR_INFO_METAVERSION_KEY: reprezentuje wersję metadanych emoji używanych przez aplikację. Jeśli ten klucz nie istnieje, aplikacja nie korzysta z EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: jeśli klucz istnieje i ma wartość true, aplikacja konfiguruje EmojiCompat, aby zastępować wszystkie emoji, nawet jeśli są one obecne w systemie.

Dowiedz się więcej o tym, jak skonfigurować instancję biblioteki EmojiCompat.

Używanie emotikonów w widokach niestandardowych

Jeśli Twoja aplikacja zawiera widoki niestandardowe, które są bezpośrednimi lub pośrednimi podklasami klasy TextView – na przykład Button, Switch lub EditText – i mogą wyświetlać treści generowane przez 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 do aplikacji z biblioteką AppCompat

Jeśli Twoja aplikacja korzysta z 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 do aplikacji bez AppCompat

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

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ć w widokach niestandardowych aplikacji symbole EmojiTextViewHelper lub EmojiEditTextHelper.

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

    • 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.

Konfigurowanie emoji2 do używania innej czcionki lub dostawcy czcionek do pobrania

Aby skonfigurować emoji2 tak, aby używać innej czcionki lub dostawcy czcionek do pobrania, wykonaj te czynności:

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

    <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ć EmojiCompat działanie.

Najważniejsza opcja konfiguracji to setMetadataLoadStrategy(), która określa, kiedy EmojiCompat wczytuje czcionkę. Wczytywanie czcionki rozpoczyna się natychmiast po wywołaniu funkcji EmojiCompat.load(), co powoduje rozpoczęcie niezbędnych pobrań. System tworzy wątek pobierania czcionki, chyba że aplikacja udostępnia własny.

LOAD_STRATEGY_MANUAL umożliwia kontrolowanie, kiedy wywoływana jest funkcja EmojiCompat.load(), a LOAD_STRATEGY_DEFAULT sprawia, że ładowanie rozpoczyna się synchronicznie w wywołaniu funkcji EmojiCompat.init().

Większość aplikacji używa LOAD_STRATEGY_MANUAL, aby kontrolować wątek i czas ładowania czcionki. Aplikacja musi odłożyć działanie do momentu wyświetlenia pierwszego ekranu, aby uniknąć opóźnienia uruchamiania. EmojiCompatInitializer postępuje zgodnie z tą zasadą i odkłada wczytywanie czcionki emoji do momentu powrotu do pierwszego ekranu.

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

  • setReplaceAll(): określa, czy EmojiCompat ma zastępować wszystkie znalezione emotikony instancjami EmojiSpan. Domyślnie, gdy EmojiCompat stwierdzi, że system może renderować emotikony, nie zastępuje ich. Gdy ta opcja jest ustawiona na true,EmojiCompat zastępuje wszystkie emotikony obiektami EmojiSpan.
  • setEmojiSpanIndicatorEnabled(): określa, czy EmojiCompat zastępuje emotikon obiektem EmojiSpan. Gdy wartość tego parametru to true, EmojiCompat rysuje tło dla elementu 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 EmojiCompat inicjowania.

Dodawanie odbiorników inicjowania

Klasy EmojiCompatEmojiCompat.Config udostępniają metody registerInitCallback()unregisterInitCallback() do rejestrowania i wyrejestrowywania wywołań zwrotnych inicjowania. Aplikacja używa tych wywołań zwrotnych, aby poczekać, aż EmojiCompat zostanie zainicjowany, 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ślnej inicjalizacji klasa EmojiCompat wywołuje metodę onInitialized(). Jeśli nie uda się zainicjować biblioteki, klasa EmojiCompat wywoła 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 pakietowych z emoji2

Możesz użyć artefaktu emoji2-bundled, aby dołączyć do aplikacji czcionkę emoji. Jednak ze względu na to, że czcionka NotoColorEmoji ma ponad 10 MB, zdecydowanie zalecamy, aby w miarę możliwości aplikacja korzystała z czcionek do pobrania. 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-bundledemoji2:

    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 opisane powyżej czynności dotyczące uwzględniania emojicompatAppCompat lub bez niego. 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 konfigurację domyślną za pomocą biblioteki startowej, EmojiCompatInitializer i DefaultEmojiCompatConfig.

Po wznowieniu pierwszej aktywności w aplikacji inicjator planuje wczytanie czcionki emoji. 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, np. Usług 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ę emoji. Pobieranie czcionki może potrwać do 10 sekund, zanim upłynie limit czasu. Po pobraniu czcionki zainicjowanie EmojiCompat na wątku w tle zajmuje około 150 milisekund.

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

Po wczytaniu EmojiCompat zużywa około 300 KB pamięci RAM na przechowywanie metadanych emoji.