あらゆる種類のアプリで絵文字の使用が急速に増加しているため、標準の絵文字セットは 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 での絵文字のサポート
2023 年 3 月の BOM(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 versionversionCodeが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 を使用して正しい画像をレンダリングします。そのため、指定された 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 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示します。すべての文字が正しくレンダリングされることを確認します。
- 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 を使用して絵文字メタデータを保持します。