Korzystaj z nowoczesnych emotikonów

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

Standardowy zestaw emotikonów jest odświeżany corocznie przez Unicode, ponieważ ich użycie w różnych aplikacjach szybko rośnie.

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 jako małe kwadratowe pole o nazwie tofu (☐) lub jako inne nieprawidłowo renderowane sekwencje emotikonów.

Aplikacje na Androidzie w wersji 11 (poziom interfejsu API 30) i starszych nie mogą aktualizować czcionki emotikonów, dlatego aplikacje, które wyświetlają je w tych wersjach, muszą zostać zaktualizowane 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 niższymi wersjami Androida. Biblioteka emoji2 zależy od biblioteki AppCompat i nie wymaga dalszej konfiguracji.

Obsługa emotikonów w sekcji „Tworzenie”

BOM z marca 2023 r. (interfejs tworzenia wiadomości 1.4) zawiera obsługę najnowszej wersji emotikonów, w tym zgodność z wersjami Androida od API 21 w stecz. Na tej stronie znajdziesz informacje o konfigurowaniu współczesnych emotikonów w systemie View. Więcej informacji znajdziesz na stronie Emotikony w komponowaniu wiadomości.

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 niższym. Ta strona zawiera nowoczesne emotikony, które możesz wyświetlić na potrzeby testowania.

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

AppCompat 1.4 zawiera obsługę emotikonów.

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 zadania, które wyświetlają tekst, rozszerzają zajęcia AppCompatActivity.

    Kotlin

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

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
  3. Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 10 lub starszym i wyświetl ten ciąg testowy. Sprawdź, czy wszystkie znaki są renderowane prawidłowo.

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

Twoja aplikacja automatycznie wyświetla zgodne z poprzednimi wersjami emotikony na wszystkich urządzeniach, które udostępniają pobierane czcionki zgodne z emoji2, np. na urządzeniach z Usługami Google Play.

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

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

Uruchom aplikację na urządzeniu, na którym niedawno przeflashowano oprogramowanie, lub na nowym emulatorze.

Wyczyść dane Usług Google Play aplikacji, aby usunąć pamięć podręczną czcionek, która może być używana 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 używa klasy związanej z tekstem w AppCompat

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

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

AppCompatActivity automatycznie wypełnia AppCompatTextView zamiast TextView podczas wypełniania pliku XML, więc nie musisz aktualizować pliku XML.

Testowy telefon nie obsługuje czcionek do pobrania

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

Emulator na starszym poziomie interfejsu API nie został zaktualizowany do Usług Google Play

Jeśli używasz emulatora na niższym poziomie interfejsu API, konieczne może być zaktualizowanie pakietu Usługi Google Play w wersji emoji2, aby znaleźć dostawcę czcionek. Aby to zrobić, zaloguj się w Sklepie Google Play na 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 Twoja aplikacja nie może zawierać AppCompat, może bezpośrednio używać emoji2. Wymaga to więcej pracy, dlatego stosuj tę metodę tylko wtedy, gdy aplikacja nie może używać AppCompat.

Aby obsługiwać emotikony bez biblioteki AppCompat:

  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 udostępnia podklasy TextView, Button i EditText, które implementują interfejs EmojiCompat. Nie używaj go w aplikacji, która zawiera dyrektywę AppCompat, ponieważ zawiera ona już właściwość 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 ... />
    

    Dzięki dodaniu modułu emoji2 system używa domyślnego pobieranego fontu emotikonów, który jest automatycznie wczytywany zaraz po uruchomieniu aplikacji. Nie jest potrzebna dodatkowa konfiguracja.

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

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

Używaj emojiCompat bez widżetów

EmojiCompat używa EmojiSpan do renderowania prawidłowych obrazów. Dlatego musi przekształcić dowolny obiekt CharSequence w obiekt Spanned z obiektmi EmojiSpan. Klasa EmojiCompat udostępnia metodę process(), która umożliwia konwertowanie obiektów CharSequences na instancje Spanned. Dzięki tej metodzie możesz wywoływać funkcję process() w tle i przechowywać w pamięci podręcznej wyniki, 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żywanie biblioteki EmojiCompat w przypadku edytorów metody wprowadzania

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

Klawiatura może też sprawdzić wersję EmojiCompat, którą obsługuje aplikacja, aby określić, które emotikony mają być renderowane 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 emotikonów, której używa aplikacja. Jeśli ten klucz nie istnieje, aplikacja nie korzysta z EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: jeśli klucz istnieje i jest ustawiony na wartość true, aplikacja konfiguruje EmojiCompat, aby zastąpić wszystkie emotikony, nawet jeśli są one 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 widoku TextView (np. Button, Switch lub EditText), a te widoki 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 Twoja aplikacja korzysta z biblioteki AppCompat.

Dodawanie widoków niestandardowych dla aplikacji za pomocą AppCompat

Jeśli Twoja aplikacja korzysta z funkcji AppCompat, rozszerz implementację AppCompat, a nie implementację platformy. Aby dowiedzieć się, jak zwiększyć liczbę wyświetleń w sekcji AppCompat, skorzystaj z tabeli poniżej:

Zamiast rozszerzania... 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 obsługi 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 pomocnicze klasy, których biblioteka AppCompat używa do implementowania obsługi emotikonów.

Aby obsługiwać widoki niestandardowe w przypadku aplikacji, które nie korzystają z usług AppCompat:

  1. Dodaj bibliotekę emoji2-views-helper:

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

  3. Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 10 lub starszym i wyświetl ten ciąg testowy. Sprawdź, czy wszystkie znaki są wyświetlane prawidłowo.

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

Opcjonalne funkcje obsługi emoji2

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

Konfigurowanie emoji2 do używania innej czcionki lub 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:

    <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 zachowania EmojiCompat

Możesz użyć instancji EmojiCompat.Config, aby zmodyfikować zachowanie EmojiCompat.

Najważniejszą opcją konfiguracji jest setMetadataLoadStrategy(), która określa, kiedy EmojiCompat ma wczytać czcionkę. Ładowanie czcionek rozpoczyna się, gdy wywołana zostanie funkcja EmojiCompat.load(), co powoduje pobieranie niezbędnych plików. System tworzy wątek do pobierania czcionek, chyba że aplikacja udostępnia własny wątek.

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

Większość aplikacji używa LOAD_STRATEGY_MANUAL, aby kontrolować wątek i czas wczytywania czcionek. Aplikacja musi odczekać do wyświetlenia pierwszego ekranu, aby uniknąć opóźnienia uruchamiania. 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 klasy podstawowej:

  • setReplaceAll(): określa, czy EmojiCompat zastępuje wszystkie znalezione emotikony instancjami EmojiSpan. Domyślnie, gdy EmojiCompat stwierdzi, że system może renderować emotikon, nie zastąpi go. 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, funkcja 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 inicjalizacji EmojiCompat.

Dodawanie odbiorców zdarzeń inicjowania

Klasy EmojiCompatEmojiCompat.Config udostępniają metody registerInitCallback()unregisterInitCallback() do rejestrowania i wyrejestrowania wywołań zwrotnych inicjalizowania. Aplikacja używa tych funkcji wywołania zwrotnego, aby oczekiwać na zainicjowanie EmojiCompat przed przetworzeniem emotikonu w wątku w tle lub w widoku niestandardowym.

Aby używać tych metod, utwórz instancję klasy EmojiCompat.InitCallback. Wywołuj te metody i przekaż instancję klasy EmojiCompat.InitCallback. Po pomyślnym zainicjowaniu 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 pakietów czcionek za pomocą emotikon2

Możesz użyć artefaktu emoji2-bundled, aby dołączyć do aplikacji czcionkę emotikonów. Ponieważ czcionka NotoColorEmoji ma rozmiar ponad 10 MB, zdecydowanie zalecamy, aby w miarę możliwości używać w aplikacji czcionek do pobrania. 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 czynności dotyczące uwzględniania emojicompat z AppCompat lub bez niego. Sprawdź, czy ciąg testowy jest wyświetlany prawidłowo.

    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 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. To krótkie opóźnienie pozwala aplikacji wyświetlić początkową treść bez potencjalnego opóźnienia spowodowanego wczytywaniem czcionek w wątku tła.

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 za pomocą Usług Google Play.

inicjator tworzy wątek w tle, aby wczytać czcionkę emotikonów, a wczytywanie czcionki może potrwać do 10 sekund, zanim zostanie przekroczony limit czasu. Po pobraniu czcionki inicjowanie EmojiCompat zajmuje wątkowi w tle około 150 ms.

Opóźnij inicjalizację EmojiCompat, nawet jeśli wyłączysz EmojiCompatInitializer. Jeśli ręcznie skonfigurujesz EmojiCompat, wywołaj funkcję EmojiCompat.load() po wyświetleniu pierwszego ekranu aplikacji, aby uniknąć korzystania z tła w czasie wczytywania pierwszego ekranu.

Po załadowaniu EmojiCompat używa około 300 KB pamięci RAM na potrzeby przechowywania metadanych emoji.