絵文字の標準セットは 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)では、最新の絵文字バージョンがサポートされています。また、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 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示して、統合をテストします。すべての文字が正しくレンダリングされるようにしてください。
- 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
を含むアプリでは使用しないでください。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
を使用して正しい画像をレンダリングします。したがって、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 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示して、統合をテストします。すべての文字が正しくレンダリングされることを確認します。
- 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 を使用します。