絵文字の標準セットは Unicode で毎年更新されており、あらゆる種類のアプリで絵文字の使用が急増しています。
アプリがインターネット コンテンツを表示する場合やテキスト入力を提供する場合は、最新の絵文字フォントをサポートすることを強くおすすめします。そうしないと、新しい絵文字が豆腐と呼ばれる小さな四角い箱(☐)や、間違ってレンダリングされた絵文字シーケンスとして表示されることがあります。
Android バージョン 11(API レベル 30)以前では絵文字フォントを更新できないため、そうした古いバージョンで絵文字を表示するアプリは手動で更新する必要があります。
最新の絵文字の例を以下に示します。
| 例 | バージョン | 
|---|---|
|   🇨🇶 | 16.0(2024 年 9 月) | 
| 🐦🔥 🧑🧑🧒🧒 👩🏽🦽➡️ 🇲🇶 | 15.1(2023 年 9 月) | 
| 🩷 🫸🏼 🐦⬛ | 15.0(2022 年 9 月) | 
| 🫠 🫱🏼🫲🏿 🫰🏽 | 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 での絵文字のサポート
BOM 2023 年 3 月(Compose UI 1.4)では、最新の絵文字バージョンがサポートされ、API 21 までの古い Android バージョンとの下位互換性も確保されています。このページでは、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 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示します。すべての文字が正しくレンダリングされることを確認します。 - 16.0: 、、🇨🇶
- 15.1: 🐦🔥、🧑🧑🧒🧒、👩🏽🦽➡️、🇲🇶
- 15.0: 🩷、🫸🏼、🐦⬛
- 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 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示します。すべての文字が正しくレンダリングされることを確認します。 - 16.0: 、、🇨🇶
- 15.1: 🐦🔥、🧑🧑🧒🧒、👩🏽🦽➡️、🇲🇶
- 15.0: 🩷、🫸🏼、🐦⬛
- 14.0: 🫠、🫱🏼🫲🏿、🫰🏽
- 13.1: 😶🌫️、🧔🏻♀️、🧑🏿❤️🧑🏾
- 13.0: 🥲、🥷🏿、🐻❄️
- 12.1: 🧑🏻🦰、🧑🏿🦯、👩🏻🤝👩🏼
- 12.0: 🦩、🦻🏿、👩🏼🤝👩🏻
 
ウィジェットなしで EmojiCompat を使用する
EmojiCompat は、EmojiSpan を使用して正しい画像をレンダリングします。したがって、EmojiSpan オブジェクトを使用して、指定された CharSequence オブジェクトを 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 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示します。すべての文字が正しくレンダリングされることを確認します。 - 16.0: 、、🇨🇶
- 15.1: 🐦🔥、🧑🧑🧒🧒、👩🏽🦽➡️、🇲🇶
- 15.0: 🩷、🫸🏼、🐦⬛
- 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組み込み手順に沿って統合をテストします。テスト文字列が正しく表示されることを確認します。- 16.0: 、、🇨🇶
- 15.1: 🐦🔥、🧑🧑🧒🧒、👩🏽🦽➡️、🇲🇶
- 15.0: 🩷、🫸🏼、🐦⬛
- 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 を使用します。
 
  