絵文字の標準セットは 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サブクラスを使用する。
AppCompatActivity は XML をインフレートする場合、
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モジュールは、 サブクラス のTextView、Button、およびEditTextを提供します。これらはEmojiCompatを実装します。このモジュールはすでにEmojiCompatを実装しているため、AppCompatを含むアプリでは使用しないでください。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オブジェクトを
Spannedオブジェクトを含むEmojiSpanオブジェクトに変換する必要があります。
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
を受け取り、true が絵文字を検出してレンダリングできる場合は EmojiCompat を返します。
また、キーボードは、アプリがサポートする 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の動作を変更する複数のオプションを提供します。
LOAD_STRATEGY_MANUALEmojiCompat の動作を変更する
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 を使用します。