Korzystaj z nowoczesnych emotikonów

Standardowy zestaw emotikonów jest co roku odświeżany przez Unicode, ponieważ coraz więcej emotikonów jest używanych we wszystkich typach aplikacji.

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

Android w wersji 11 (poziom interfejsu API 30) i starszych nie może zaktualizować czcionki emotikonów, dlatego aplikacje, które wyświetlają je w tych wersjach, należy zaktualizować 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 jest zależność od biblioteki AppCompat i nie wymaga dodatkowej konfiguracji.

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

BOM marca 2023 r. (Compose UI 1.4) zapewnia obsługę najnowszej wersji emotikonów, w tym zgodność wsteczną ze starszymi wersjami Androida aż do interfejsu API 21. Na tej stronie dowiesz się, jak skonfigurować nowoczesne emotikony w systemie widoków. Więcej informacji znajdziesz na stronie Emotikony w oknie 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. Znajdziesz tam nowoczesne emotikony, które możesz wyświetlać w ramach testów.

Korzystanie z AppCompat w celu obsługi najnowszych emotikonów

AppCompat Wersja 1.4 zapewnia obsługę emotikonów.

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

  1. Sprawdź, czy moduł korzysta z 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 renderują się poprawnie.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 🥳
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

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

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

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

Używasz aplikacji na urządzeniu z niedawno zainstalowaną aktualizacją lub nowym emulatorze

Wyczyść dane aplikacji Usługi Google Play, aby wyczyścić pamięć podręczną czcionek, które mogły wystąpić podczas uruchamiania aplikacji. To zwykle rozwiązuje problem w ciągu kilku godzin.

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

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

Twoja aplikacja nie używa klasy tekstowej AppCompat

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

  • Aktywność obejmuje okres AppCompatActivity.
  • Jeśli tworzysz widok w kodzie, użyj właściwej podklasy AppCompat.

Podczas tworzenia pliku XML AppCompatActivity automatycznie dodaje AppCompatTextView w miejscu TextView, dzięki czemu nie musisz aktualizować pliku 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, może być konieczne zaktualizowanie pakietu Usług Google Play dla emoji2, aby znaleźć dostawcę czcionki. 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ługa emotikonów bez AppCompat

Jeśli aplikacja nie może zawierać elementu 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ć metody 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 AppCompat, ponieważ zawiera już ona EmojiCompat.

  2. W kodzie XML i kodzie tam, gdzie używasz TextView, EditText lub Button, użyj zamiast niego EmojiTextView, EmojiEditText lub EmojiButton.

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

    Dzięki dodaniu modułu emoji2 system używa domyślnego dostawcy czcionek do pobrania, aby automatycznie ładować czcionkę emotikonów tuż po uruchomieniu aplikacji. Nie musisz niczego konfigurować.

  3. Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 11 lub starszym i wyświetl poniższe ciągi testowe. Sprawdź, czy wszystkie znaki renderują się poprawnie.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 🥳
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

Używaj emotikonów bez widżetów

Do renderowania prawidłowych obrazów EmojiCompat używa narzędzia EmojiSpan. Dlatego musi przekonwertować dowolny obiekt CharSequence na obiekt Spanned z EmojiSpan obiektami. Klasa EmojiCompat udostępnia metodę process(), która pozwala przekonwertować CharSequences na wystąpienia Spanned. Korzystając z tej metody, możesz wywoływać process() w tle i zapisywać wyniki w pamięci podręcznej, co poprawia wydajność aplikacji.

Kotlin

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

Java

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

Używaj atrybutu EmojiCompat w edytorach metody 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 wystąpienie elementu EmojiCompat może wyrenderować emotikon. Ta metoda pobiera CharSequence emotikona i zwraca true, jeśli EmojiCompat potrafi wykryć i wyrenderować emotikon.

Aby określić, które emotikony mają być renderowane w palecie, klawiatura może również sprawdzić wersję EmojiCompat obsługiwaną przez aplikację. Aby sprawdzić wersję, klawiatura może wyszukiwać te klawisze w pakiecie EditorInfo.extras:

  • EDITOR_INFO_METAVERSION_KEY: reprezentuje wersję metadanych emotikonów używanych przez aplikację. Jeśli ten klucz nie istnieje, oznacza to, że aplikacja nie używa klucza EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: jeśli klucz istnieje i ma wartość true, aplikacja konfiguruje EmojiCompat w taki sposób, aby zastępowała wszystkie emotikony, nawet jeśli są one dostępne 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 kategorii TextView, np. Button, Switch lub EditText, i mogą wyświetlać treści użytkowników, każde z nich musi implementować EmojiCompat.

Ten proces różni się w zależności od tego, czy aplikacja korzysta z 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, skorzystaj z pomocy w integracji widoków w module emoji2-views-helper przeznaczonych do stosowania w widokach niestandardowych. Biblioteka AppCompat używa tych funkcji do wdrażania obsługi emotikonów.

Aby zapewnić obsługę widoków niestandardowych 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. Wykonaj instrukcje dodawania 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 ten ciąg testowy. Sprawdź, czy wszystkie znaki renderują się poprawnie.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 🥳
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

Opcjonalne funkcje obsługi emotikonów2

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

Konfigurowanie emotikonów2, aby używać innej czcionki lub czcionki do pobrania

Aby skonfigurować w emoji2 korzystanie z innego dostawcy czcionek lub 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:

Zmienianie działania EmojiCompat

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

Najważniejszą opcją konfiguracji jest setMetadataLoadStrategy(), która określa, kiedy EmojiCompat wczytuje czcionkę. Ładowanie czcionki rozpoczyna się natychmiast po wywołaniu funkcji EmojiCompat.load() i powoduje uruchomienie pobierania. System utworzy wątek pobierania czcionki, chyba że aplikacja go udostępnia.

LOAD_STRATEGY_MANUAL pozwala określić, kiedy ma być wywoływane EmojiCompat.load(), a LOAD_STRATEGY_DEFAULT sprawia, że wczytywanie jest synchroniczne w trakcie wywołania EmojiCompat.init().

Większość aplikacji używa LOAD_STRATEGY_MANUAL, dzięki któremu mogą kontrolować wątek i czas wczytywania czcionki. Aby uniknąć opóźnienia podczas uruchamiania, aplikacja musi zostać opóźniona do momentu wyświetlenia pierwszego ekranu. EmojiCompatInitializer stosuje tę praktykę i opóźnia wczytywanie czcionki emotikonów do momentu wznowienia pierwszego ekranu.

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

  • setReplaceAll(): określa, czy EmojiCompat zastępuje wszystkie znalezione emotikony wystąpieniami EmojiSpan. Domyślnie, gdy EmojiCompat ustali, że system może wyrenderować emotikon, nie zastąpi go domyślnie. Gdy ma wartość true, EmojiCompat zastępuje wszystkie emotikony EmojiSpan obiektami.
  • setEmojiSpanIndicatorEnabled(): wskazuje, czy EmojiCompat zastępuje emotikon obiektem EmojiSpan. Gdy zasada ma wartość true, EmojiCompat rysuje tło dla EmojiSpan. Ta metoda jest używana głównie do debugowania.
  • setEmojiSpanIndicatorColor: ustawia kolor na EmojiSpan. Wartość domyślna to GREEN.
  • registerInitCallback(): informuje aplikację o stanie inicjowania EmojiCompat.

Dodaj detektory inicjowania

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

Aby korzystać z tych metod, utwórz instancję klasy EmojiCompat.InitCallback. Wywołaj te metody i przekaż wystąpienie klasy EmojiCompat.InitCallback. Jeśli inicjowanie się powiedzie, klasa EmojiCompat wywołuje metodę onInitialized(). Jeśli biblioteki nie uda się zainicjować, 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ługuj pakiety czcionek za pomocą emotikonów2

Za pomocą artefaktu emoji2-bundled możesz dodać czcionkę emotikonów do swojej aplikacji. Jednak ponieważ rozmiar czcionki NotoColorEmoji przekracza 10 MB, zdecydowanie zalecamy, aby w miarę możliwości używać czcionek do pobrania w aplikacji. Artefakt emoji2-bundled jest przeznaczony dla aplikacji na urządzenia, które nie obsługują czcionek do pobrania.

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

  1. Uwzględnij emoji2-bundled i emoji2 artefaktów:

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. Skonfiguruj emoji2 tak, aby korzystał z konfiguracji zawartej w pakiecie:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))
    

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
    
  3. Przetestuj integrację, wykonując powyższe czynności, aby uwzględnić właściwość emojicompat z elementem AppCompat lub bez niego. Sprawdź, czy ciąg testowy wyświetla się poprawnie.

    • 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
    • 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻 🥳
    • 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
    • 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻

Wpływ automatycznej konfiguracji EmojiCompat

System zastosuje domyślną konfigurację za pomocą biblioteki startowej EmojiCompatInitializer i DefaultEmojiCompatConfig.

Po wznowieniu pierwszej aktywności w aplikacji inicjator planuje wczytywanie czcionek emotikonów. Dzięki temu krótkiemu opóźnieniu aplikacja może wyświetlić początkową treść bez żadnych opóźnień spowodowanych wczytywaniem czcionki w wątku w tle.

DefaultEmojiCompatConfig szuka zainstalowanego przez system dostawcy czcionek, który implementuje interfejs EmojiCompat, np. Usługi Google Play. Na urządzeniach z Usługami Google Play czcionki są wczytywane za pomocą Usług Google Play.

Inicjator tworzy wątek w tle w celu wczytania czcionki emotikonów, a jej pobieranie może potrwać do 10 sekund. Po pobraniu czcionki inicjowanie EmojiCompat w wątku w tle trwa około 150 milisekund.

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

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