絵文字の使用があらゆるタイプのアプリで急速に増加しているため、絵文字の標準セットは Unicode によって毎年更新されています。
アプリがインターネット コンテンツを表示する場合やテキスト入力を提供する場合は、最新の絵文字フォントをサポートすることを強くおすすめします。そうしないと、その後の絵文字が「豆腐」(🛍?)と呼ばれる小さな四角いボックスや、不適切にレンダリングされた絵文字シーケンスとして表示されることがあります。
Android バージョン 11(API レベル 30)以前では絵文字フォントを更新できないため、これらのバージョンで絵文字を表示するアプリは手動で更新する必要があります。
以下に、最新の絵文字の例を示します。
例 | バージョン |
---|---|
🫠 🫱🏼🫲🏿 🫰🏽 | 14.0(2021 年 9 月) |
😶🌫️ 🧔🏻♀️ 🧑🏿❤️🧑🏾 | 13.1(2020 年 9 月) |
🥲 🥷🏿 🐻❄️ | 13.0(2020 年 3 月) |
🧑🏻🦰 🧑🏿🦯 👩🏻🤝👩🏼 | 12.1(2019 年 10 月) |
🦩 🦻🏿 👩🏼🤝👩🏻 | 12.0(2019 年 2 月) |
androidx.emoji2:emoji2
ライブラリは、以前のバージョンの Android とのシンプルな下位互換性を備えています。emoji2
ライブラリは AppCompat
ライブラリの依存関係であり、それ以上の構成作業は必要ありません。
Compose での絵文字のサポート
2023 年 3 月の BOM(Compose UI 1.4)では、古い Android バージョンとの下位互換性を API 21 までサポートするなど、最新の絵文字バージョンがサポートされます。このページでは、View システムで最新の絵文字を構成する方法について説明します。詳しくは、Compose 内の絵文字のページをご覧ください。
前提条件
アプリで新しい絵文字が適切に表示されることを確認するには、Android 10(API レベル 29)以前を搭載したデバイスでアプリを起動します。このページには、テスト用に表示できる最新の絵文字が含まれています。
AppCompat を使用して最新の絵文字をサポートする
AppCompat
1.4 では絵文字がサポートされています。
AppCompat
を使用して絵文字をサポートする手順は次のとおりです。
使用しているモジュールが
AppCompat
ライブラリ バージョン 1.4.0-alpha01 以降に依存していることを確認します。build.gradle // Ensure version is 1.4.0-alpha01 or higher. implementation "androidx.appcompat:appcompat.$appcompatVersion"
テキストを表示するすべてのアクティビティで、
AppCompatActivity
クラスを拡張します。Kotlin
MyActivity.kt class MyActivity: AppCompatActivity { ... }
Java
MyActivity.java class MyActivity extends AppCompatActivity { ... }
Android 10 以前を搭載しているデバイスでアプリを起動し、次のテスト文字列を表示することで、統合をテストします。すべての文字が正しくレンダリングされるようにしてください。
- 14.0: 🫠、🫱🏼🫲🏿、🫰🏽
- 13.1: 😶🌫️、🧔🏻♀️、🧑🏿❤️🧑🏾
- 13.0: 🥲、🥷🏿、🐻❄️
- 12.1: 🧑🏻🦰、🧑🏿🦯、👩🏻🤝👩🏼
- 12.0: 🦩、🦻🏿、👩🏼🤝👩🏻
アプリは、emoji2
互換のダウンロード可能なフォント プロバイダを提供するすべてのデバイス(Google Play 開発者サービスを搭載したデバイスなど)で、下位互換性のある絵文字を自動的に表示します。
アプリが AppCompat を使用しているにもかかわらず、豆腐(☐)が表示される場合
AppCompat
ライブラリを追加しても、アプリで適切な絵文字ではなく豆腐が表示されるケースがあります。考えられる説明と解決策は次のとおりです。
最近フラッシュしたデバイスまたは新しいエミュレータでアプリを実行している
アプリの Google Play 開発者サービスのデータを消去して、起動時に発生する可能性のあるフォントのキャッシュを消去します。通常、問題は数時間後に解決します。
アプリデータを消去する手順は次のとおりです。
Android デバイスで [設定] を開きます。
[アプリと通知] をタップします。
[アプリをすべて表示] または [アプリ情報] をタップします。
アプリをスクロールして [Google Play 開発者サービス] をタップします。
[ストレージとキャッシュ] をタップします。
[キャッシュを消去] をタップします。
アプリが AppCompat のテキスト関連クラスを使用していない
これは、AppCompatActivity
を拡張していない場合や、TextView
などのコード内でビューをインスタンス化した場合に発生することがあります。確認する点は次のとおりです。
- アクティビティで
AppCompatActivity
を拡張している。 - コード内でビューを作成する場合は、正しい
AppCompat
サブクラスを使用します。
XML をインフレートする場合、AppCompatActivity
は自動的に TextView
の代わりに AppCompatTextView
をインフレートするので、XML を更新する必要はありません。
テスト用のスマートフォンがダウンロード可能なフォントをサポートしていない
DefaultEmojiCompatConfig.create
が null でない構成を返すことを確認してください。
以前の API レベルのエミュレータで Google Play 開発者サービスがアップグレードされていない
以前の API レベルでエミュレータを使用する場合は、emoji2
用にバンドルされた Google Play 開発者サービスを更新して、フォント プロバイダを見つける必要があります。これを行うには、エミュレータで Google Play ストアにログインします。
互換性のあるバージョンがインストールされていることを確認するには、次のようにします。
次のコマンドを実行します。
adb shell dumpsys package com.google.android.gms | grep version
versionCode
が211200000
より大きいことを確認します。
AppCompat なしで絵文字をサポートする
アプリに AppCompat
を含めることができない場合は、emoji2
を直接使用できます。追加の作業が必要になるため、アプリで AppCompat
を使用できない場合にのみ、この方法を使用してください。
AppCompat
ライブラリなしで絵文字をサポートする手順は次のとおりです。
アプリの
build.gradle
ファイルにemoji2
とemoji2-views
を組み込みます。build.gradle def emojiVersion = "1.0.0-alpha03" implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-views:$emojiVersion"
emoji2-views
モジュールには、EmojiCompat
を実装するTextView
、Button
、EditText
のサブクラスが用意されています。AppCompat
を含むアプリでは使用しないでください。すでにEmojiCompat
が実装されています。XML とコード(
TextView
、EditText
、Button
のいずれか)では、代わりにEmojiTextView
、EmojiEditText
、またはEmojiButton
を使用します。activity_main.xml <androidx.emoji2.widget.EmojiTextView ... /> <androidx.emoji2.widget.EmojiEditText ... /> <androidx.emoji2.widget.EmojiButton ... />
emoji2
モジュールを含めると、システムはデフォルトのダウンロード可能なフォント プロバイダを使用して、アプリの起動直後に絵文字フォントを自動的に読み込みます。これ以上の構成は必要ありません。統合をテストするには、Android 11 以前を搭載し、次のテスト文字列を表示しているデバイスでアプリを起動します。すべての文字が正しくレンダリングされるようにしてください。
- 14.0: 🫠、🫱🏼🫲🏿、🫰🏽
- 13.1: 😶🌫️、🧔🏻♀️、🧑🏿❤️🧑🏾
- 13.0: 🥲、🥷🏿、🐻❄️
- 12.1: 🧑🏻🦰、🧑🏿🦯、👩🏻🤝👩🏼
- 12.0: 🦩、🦻🏿、👩🏼🤝👩🏻
ウィジェットなしで EmojiCompat を使用する
EmojiCompat
は EmojiSpan
を使用して正しい画像をレンダリングします。そのため、特定の CharSequence
オブジェクトを、EmojiSpan
オブジェクトを含む Spanned
オブジェクトに変換する必要があります。EmojiCompat クラスは、CharSequences
を Spanned
インスタンスに変換する process()
メソッドを提供します。このメソッドを使用すると、バックグラウンドで process()
を呼び出して結果をキャッシュに保存できるため、アプリのパフォーマンスが向上します。
Kotlin
val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")
Java
CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");
インプット メソッド エディタで EmojiCompat を使用する
EmojiCompat
クラスを使用すると、操作対象のアプリでサポートされている絵文字をキーボードでレンダリングできます。インプット メソッド エディタ(IME)は、getEmojiMatch()
メソッドを使用して、EmojiCompat
のインスタンスが絵文字をレンダリングできるかどうかを確認できます。このメソッドは、絵文字の CharSequence
を受け取り、EmojiCompat
が絵文字を検出してレンダリングできる場合に true
を返します。
また、キーボードは、アプリがサポートする EmojiCompat
のバージョンを確認して、パレットでレンダリングする絵文字を決定できます。バージョンを確認するため、キーボードは EditorInfo.extras
バンドル内で次のキーを検索できます(利用可能な場合)。
EDITOR_INFO_METAVERSION_KEY
: アプリが使用する絵文字メタデータのバージョンを表します。このキーが存在しない場合、アプリはEmojiCompat
を使用していません。EDITOR_INFO_REPLACE_ALL_KEY
: キーが存在し、true
に設定されている場合、アプリは絵文字がシステムに存在する場合でも、すべての絵文字を置き換えるようにEmojiCompat
を構成します。
EmojiCompat のインスタンスを構成する方法をご確認ください。
カスタムビューで絵文字を使用する
TextView
の直接的または間接的なサブクラスであるカスタムビュー(Button
、Switch
、EditText
など)がアプリにあり、それらのビューでユーザー作成コンテンツを表示できる場合、それぞれに EmojiCompat
を実装する必要があります。
このプロセスは、アプリが AppCompat
ライブラリを使用するかどうかによって異なります。
AppCompat を使用するアプリにカスタムビューを追加する
アプリで AppCompat
を使用している場合は、プラットフォーム実装ではなく AppCompat
実装を拡張します。AppCompat
でビューを拡張する方法については、次の表を参考にしてください。
以下を拡張する代わりに... | 以下を拡張します |
---|---|
TextView
|
AppCompatTextView
|
EditText
|
AppCompatEditText
|
ToggleButton
|
AppCompatToggleButton
|
Switch
|
SwitchCompat
|
Button
|
AppCompatButton
|
CheckedTextView
|
AppCompatCheckedTextView
|
RadioButton
|
AppCompatRadioButton
|
CheckBox
|
AppCompatCheckBox
|
AutoCompleteTextView
|
AppCompatAutoCompleteTextView
|
MultiAutoCompleteTextView
|
AppCompatMultiAutoCompleteTextView
|
AppCompat を使用しないアプリにカスタムビューを追加する
AppCompat
を使用しないアプリの場合は、カスタムビューで使用できるように設計されたビュー統合ヘルパー(emoji2-views-helper
モジュールにあります)を使用します。これらは、AppCompat
ライブラリが絵文字のサポートを実装するために使用するヘルパーです。
AppCompat
を使用しないアプリでカスタムビューをサポートする手順は次のとおりです。
emoji2-views-helper
ライブラリを追加します。implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
手順に沿って、アプリのカスタムビューに
EmojiTextViewHelper
またはEmojiEditTextHelper
を含めます。Android 10 以前を搭載しているデバイスでアプリを起動し、次のテスト文字列を表示することで、統合をテストします。すべての文字が正しくレンダリングされるようにしてください。
- 14.0: 🫠、🫱🏼🫲🏿、🫰🏽
- 13.1: 😶🌫️、🧔🏻♀️、🧑🏿❤️🧑🏾
- 13.0: 🥲、🥷🏿、🐻❄️
- 12.1: 🧑🏻🦰、🧑🏿🦯、👩🏻🤝👩🏼
- 12.0: 🦩、🦻🏿、👩🏼🤝👩🏻
emoji2 処理のオプション機能
アプリに emoji2
ライブラリを追加したら、このセクションで説明するオプション機能を追加できます。
別のフォントまたはダウンロード可能なフォントのプロバイダを使用するように emoji2 を構成する
別のフォントまたはダウンロード可能なフォントのプロバイダを使用するように emoji2
を構成する手順は次のとおりです。
マニフェストに次の行を追加して、
EmojiCompatInitializer
を無効にします。<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>
次のいずれかを行います。
DefaultEmojiCompatConfiguration.create(context)
を呼び出して、デフォルト構成を使用します。EmojiCompat.Config
を使用して、別のソースからフォントを読み込む独自の構成を作成する。このクラスには、次のセクションで説明するように、EmojiCompat
の動作を変更するオプションがいくつか用意されています。
EmojiCompat の動作を変更する
EmojiCompat.Config
のインスタンスを使用して、EmojiCompat
の動作を変更できます。
最も重要な構成オプションは setMetadataLoadStrategy()
です。これは、EmojiCompat
がフォントを読み込むタイミングを制御します。EmojiCompat.load()
が呼び出されるとすぐにフォントの読み込みが開始され、必要なダウンロードがトリガーされます。アプリが提供していない限り、フォント ダウンロード用のスレッドはシステムによって作成されます。
LOAD_STRATEGY_MANUAL
を使用すると、EmojiCompat.load()
が呼び出されるタイミングを制御できます。また、LOAD_STRATEGY_DEFAULT
を使用すると、EmojiCompat.init()
の呼び出しで読み込みが同期的に開始されます。
ほとんどのアプリは、スレッドとフォント読み込みのタイミングを制御できるように、LOAD_STRATEGY_MANUAL
を使用します。起動レイテンシが発生しないように、アプリは最初の画面が表示されるまで延期する必要があります。EmojiCompatInitializer
はこの方法に従い、最初の画面が再開するまで絵文字フォントの読み込みを延期します。
基本クラスの次のメソッドを使用して、構成の他の要素を設定します。
setReplaceAll()
:EmojiCompat
が検出したすべての絵文字をEmojiSpan
のインスタンスに置き換えるかどうかを決定します。デフォルトでは、EmojiCompat
はシステムが絵文字をレンダリングできると推測した場合、その絵文字を置き換えません。true
に設定すると、EmojiCompat
はすべての絵文字をEmojiSpan
オブジェクトに置き換えます。setEmojiSpanIndicatorEnabled()
:EmojiCompat
が絵文字をEmojiSpan
オブジェクトに置き換えるかどうかを示します。true
に設定すると、EmojiCompat
はEmojiSpan
のバックグラウンドを描画します。このメソッドは主にデバッグ目的で使用します。setEmojiSpanIndicatorColor
:EmojiSpan
を示す色を設定します。デフォルト値はGREEN
です。registerInitCallback()
:EmojiCompat
の初期化の状態をアプリに通知します。
初期化リスナーを追加する
EmojiCompat
クラスと EmojiCompat.Config
クラスには、初期化コールバックの登録と登録解除を行うための registerInitCallback()
メソッドと unregisterInitCallback()
メソッドが用意されています。アプリはこれらのコールバックを使用して、EmojiCompat
が初期化されるまで待機してから、バックグラウンド スレッドまたはカスタムビューで絵文字を処理します。
これらのメソッドを使用するには、EmojiCompat.InitCallback
クラスのインスタンスを作成します。これらのメソッドを呼び出して、EmojiCompat.InitCallback
クラスのインスタンスを渡します。初期化が成功すると、EmojiCompat
クラスは onInitialized()
メソッドを呼び出します。ライブラリの初期化に失敗した場合、EmojiCompat
クラスは onFailed()
メソッドを呼び出します。
初期化状態を任意の時点で確認するには、getLoadState()
メソッドを呼び出します。このメソッドは、LOAD_STATE_LOADING
、LOAD_STATE_SUCCEEDED
、LOAD_STATE_FAILED
のいずれかの値を返します。
emoji2 がバンドルされたフォントのサポート
emoji2-bundled
アーティファクトを使用すると、絵文字フォントをアプリにバンドルできます。ただし、NotoColorEmoji
フォントが 10 MB を超えているため、可能な限りダウンロード可能フォントを使用することを強くおすすめします。emoji2-bundled
アーティファクトは、ダウンロード可能フォントをサポートしていないデバイス上のアプリを対象としています。
emoji2-bundled
アーティファクトを使用する手順は次のとおりです。
emoji2-bundled
アーティファクトとemoji2
アーティファクトを含めます。implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
バンドル構成を使用するように
emoji2
を構成します。Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
AppCompat
の有無にかかわらず、上記の手順に沿ってemojicompat
を追加して統合をテストします。テスト文字列が正しく表示されることを確認します。- 14.0: 🫠、🫱🏼🫲🏿、🫰🏽
- 13.1: 😶🌫️、🧔🏻♀️、🧑🏿❤️🧑🏾
- 13.0: 🥲、🥷🏿、🐻❄️
- 12.1: 🧑🏻🦰、🧑🏿🦯、👩🏻🤝👩🏼
- 12.0: 🦩、🦻🏿、👩🏼🤝👩🏻
EmojiCompat 自動構成の影響
システムは、起動ライブラリ EmojiCompatInitializer
と DefaultEmojiCompatConfig
を使用してデフォルト構成を適用します。
アプリ内の最初のアクティビティが再開した後、イニシャライザは絵文字フォントの読み込みをスケジュールします。このわずかな遅延により、アプリはバックグラウンド スレッドでのフォントの読み込みによるレイテンシを発生させることなく、初期コンテンツを表示できます。
DefaultEmojiCompatConfig
は、EmojiCompat
インターフェースを実装する、システムによりインストールされたダウンロード可能なフォント プロバイダ(Google Play 開発者サービスなど)を検索します。Google Play 開発者サービスを備えたデバイスでは、Google Play 開発者サービスを使用してフォントが読み込まれます。
イニシャライザは、絵文字フォントを読み込むバックグラウンド スレッドを作成します。フォントのダウンロードは、タイムアウトするまでに最大 10 秒かかることがあります。フォントがダウンロードされた後、バックグラウンド スレッドで EmojiCompat
を初期化するのに約 150 ミリ秒かかります。
EmojiCompatInitializer
を無効にした場合でも、EmojiCompat
の初期化を遅延してください。EmojiCompat
を手動で構成する場合は、アプリの最初の画面が表示された後に EmojiCompat.load()
を呼び出して、最初の画面の読み込みとのバックグラウンド競合を回避します。
読み込み後、EmojiCompat
は絵文字のメタデータを保持するために約 300 KB の RAM を使用します。