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:
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"
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 { ... }
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:
Otwórz Ustawienia w urządzeniu z systemem Android.
Kliknij Aplikacje i powiadomienia.
Kliknij Wyświetl wszystkie aplikacje lub Informacje o aplikacji.
Przewiń listę aplikacji i kliknij Usługi Google Play.
Kliknij Pamięć urządzenia i pamięć podręczna.
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:
Uruchom to polecenie:
adb shell dumpsys package com.google.android.gms | grep version
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:
W pliku
build.gradle
aplikacji umieśćemoji2
iemoji2-views
.build.gradle def emojiVersion = "1.0.0-alpha03" implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-views:$emojiVersion"
Moduł
emoji2-views
zawiera podklasyTextView
,Button
iEditText
, które implementująEmojiCompat
. Nie używaj go w aplikacji, która zawiera dyrektywęAppCompat
, ponieważ zawiera ona już dyrektywęEmojiCompat
.W pliku XML i kodzie tam, gdzie używasz właściwości
TextView
,EditText
lubButton
, użyj zamiast tego koduEmojiTextView
,EmojiEditText
lubEmojiButton
.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.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 zEmojiCompat
.EDITOR_INFO_REPLACE_ALL_KEY
: jeśli klucz istnieje i jest ustawiony natrue
, 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
:
Dodaj bibliotekę
emoji2-views-helper
:implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
Postępuj zgodnie z instrukcjami, aby dodać
EmojiTextViewHelper
lubEmojiEditTextHelper
do widoków niestandardowych aplikacji.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:
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>
Wykonać jedną z tych czynności:
Użyj konfiguracji domyślnej, wywołując metodę
DefaultEmojiCompatConfiguration.create(context)
.Utwórz własną konfigurację, aby wczytywać czcionki z innego źródła za pomocą
EmojiCompat.Config
. Ta klasa udostępnia kilka opcji modyfikowania działaniaEmojiCompat
, jak opisano w następnej sekcji.
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, czyEmojiCompat
zastępuje wszystkie znalezione emotikony wystąpieniamiEmojiSpan
. Domyślnie, gdyEmojiCompat
określi, że system może wyrenderować emotikon, nie zastępuje tego emotikonu. Gdy ustawiona jest wartośćtrue
,EmojiCompat
zastępuje wszystkie emotikony obiektamiEmojiSpan
.setEmojiSpanIndicatorEnabled()
: wskazuje, czyEmojiCompat
zastępuje emotikon obiektemEmojiSpan
. Gdy ustawisz wartośćtrue
,EmojiCompat
będzie rysować tło dla:EmojiSpan
. Ta metoda jest używana głównie do debugowania.setEmojiSpanIndicatorColor
: ustawia kolorEmojiSpan
. Wartością domyślną jestGREEN
.registerInitCallback()
: informuje aplikację o stanie inicjowaniaEmojiCompat
.
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
:
Uwzględnij artefakty
emoji2-bundled
iemoji2
:implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
Skonfiguruj
emoji2
tak, aby korzystała z połączonej konfiguracji:Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
Przetestuj integrację, wykonując poprzednie kroki pozwalające dodać
emojicompat
zAppCompat
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.