最新の絵文字のサポート

絵文字の標準セットは、あらゆる種類のアプリで絵文字の使用が急増しているため、Unicode で毎年更新されています。

アプリがインターネット コンテンツを表示する場合やテキスト入力を提供する場合、最新の絵文字フォントをサポートすることを強くおすすめします。そうしないと、後で絵文字が豆腐(QUIC)と呼ばれる小さな正方形のボックスとして表示されることがあります(または、その他の正しくレンダリングされない絵文字シーケンス)ことがあります。

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 月 BOMCompose UI 1.4)では、最新の絵文字バージョンのサポートが追加されました。これには、API 21 までの古い Android バージョンとの下位互換性が含まれます。このページでは、View システムで最新の絵文字を設定する方法について説明します。詳しくは、Compose の絵文字のページをご覧ください。

前提条件

アプリが新しい絵文字を適切に表示していることを確認するには、Android 10(API レベル 29)以下を搭載したデバイスでアプリを起動します。このページでは、テスト用に表示できる最新の絵文字を紹介します。

AppCompat を使用して最新の絵文字をサポートする

AppCompat 1.4 では絵文字がサポートされています。

AppCompat を使用して絵文字をサポートする手順は次のとおりです。

  1. 使用しているモジュールが AppCompat ライブラリ バージョン 1.4.0-alpha01 以降に依存していることを確認します。

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. テキストを表示するすべてのアクティビティで、AppCompatActivity クラスを拡張します。

    Kotlin

    MyActivity.kt
    
    class MyActivity: AppCompatActivity {
    ...
    }
    

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
    
  3. Android 10 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示して、統合をテストします。すべての文字が正しくレンダリングされることを確認します。

    • 14.0: 🫠、🫱🏼‍🫲🏿、🫰🏽
    • 13.1: 😶‍🌫️、🧔🏻‍♀️、🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲、🥷🏿、🐻‍❄️
    • 12.1: 🧑🏻‍🦰、🧑🏿‍🦯、👩🏻‍🤝‍👩🏼
    • 12.0: 🦩、🦻🏿、👩🏼‍🤝‍👩🏻

アプリは、emoji2 互換のダウンロード可能フォント プロバイダを提供するすべてのデバイス(Google Play 開発者サービスを搭載したデバイスなど)で、下位互換性のある絵文字を自動的に表示します。

アプリが AppCompat を使用しているにもかかわらず、豆腐(☐)が表示される場合

AppCompat ライブラリを追加した場合でも、アプリで適切な絵文字ではなく豆腐が表示される可能性があります。考えられる説明と解決策は次のとおりです。

最近フラッシュしたデバイスまたは新しいエミュレータでアプリを実行している

アプリの Google Play 開発者サービスのデータを消去して、起動時に発生する可能性のあるフォント キャッシュを消去します。通常、数時間後には問題が解決します。

アプリのデータを消去する手順は次のとおりです。

  1. Android デバイスで [設定] を開きます。

  2. [アプリと通知] をタップします。

  3. [アプリをすべて表示] または [アプリ情報] をタップします。

  4. アプリをスクロールして [Google Play 開発者サービス] をタップします。

  5. [ストレージとキャッシュ] をタップします。

  6. [キャッシュを消去] をタップします。

アプリが AppCompat のテキスト関連クラスを使用していない

これは、AppCompatActivity を拡張しない場合や、コード内でビュー(TextView など)をインスタンス化した場合に発生することがあります。確認する点は次のとおりです。

  • アクティビティで AppCompatActivity を拡張している。
  • コード内でビューを作成する場合は、正しい AppCompat サブクラスを使用します。

XML をインフレートする場合、AppCompatActivity は自動的に TextView の代わりに AppCompatTextView をインフレートするので、XML を更新する必要はありません。

テスト用のスマートフォンがダウンロード可能なフォントをサポートしていない

DefaultEmojiCompatConfig.create が null でない構成を返すことを確認してください。

以前の API レベルのエミュレータで Google Play 開発者サービスがアップグレードされていない

以前の API レベルでエミュレータを使用している場合、emoji2 にバンドルされている Google Play 開発者サービスを更新してフォント プロバイダを検出しなければならない場合があります。そのためには、エミュレータで Google Play ストアにログインします。

互換性のあるバージョンがインストールされていることを確認するには、次の手順を行います。

  1. 次のコマンドを実行します。

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. versionCode211200000 より大きいことを確認します。

AppCompat なしで絵文字をサポートする

アプリに AppCompat を含められない場合は、emoji2 を直接使用できます。これには追加作業が必要となるため、アプリで AppCompat を使用できない場合にのみ、このメソッドを使用してください。

AppCompat ライブラリなしで絵文字をサポートする手順は次のとおりです。

  1. アプリの build.gradle ファイルに emoji2emoji2-views を組み込みます。

    build.gradle
    
    def emojiVersion = "1.0.0-alpha03"
    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-views:$emojiVersion"
    

    emoji2-views モジュールには、EmojiCompat を実装する TextViewButtonEditTextサブクラスが用意されています。AppCompat を含むアプリでは EmojiCompat をすでに実装しているため、これは使用しないでください。

  2. XML とコードで TextViewEditTextButton を使用する場合は、代わりに EmojiTextViewEmojiEditText、または EmojiButton を使用します。

    activity_main.xml
    
    <androidx.emoji2.widget.EmojiTextView ... />
    <androidx.emoji2.widget.EmojiEditText ... />
    <androidx.emoji2.widget.EmojiButton ... />
    

    emoji2 モジュールを含めると、システムはデフォルトのダウンロード可能フォント プロバイダを使用して、アプリの起動直後に絵文字フォントを自動的に読み込みます。追加の構成は必要ありません。

  3. 統合をテストするには、Android 11 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示します。すべての文字が正しくレンダリングされることを確認します。

    • 14.0: 🫠、🫱🏼‍🫲🏿、🫰🏽
    • 13.1: 😶‍🌫️、🧔🏻‍♀️、🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲、🥷🏿、🐻‍❄️
    • 12.1: 🧑🏻‍🦰、🧑🏿‍🦯、👩🏻‍🤝‍👩🏼
    • 12.0: 🦩、🦻🏿、👩🏼‍🤝‍👩🏻

ウィジェットなしで EmojiCompat を使用する

EmojiCompatEmojiSpan を使用して正しい画像をレンダリングします。したがって、任意の CharSequence オブジェクトを EmojiSpan オブジェクトを持つ Spanned オブジェクトに変換する必要があります。EmojiCompat クラスは、CharSequencesSpanned インスタンスに変換する 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 の直接的または間接的なサブクラス(ButtonSwitchEditText など)であるカスタムビューがあり、それらのビューでユーザー作成コンテンツを表示できる場合は、それぞれ 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 を使用しないアプリでカスタムビューをサポートする手順は次のとおりです。

  1. emoji2-views-helper ライブラリを追加します。

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. 手順に沿って、アプリのカスタムビューに EmojiTextViewHelper または EmojiEditTextHelper を含めます。

  3. Android 10 以前を搭載したデバイスでアプリを起動し、次のテスト文字列を表示して、統合をテストします。すべての文字が正しくレンダリングされることを確認します。

    • 14.0: 🫠、🫱🏼‍🫲🏿、🫰🏽
    • 13.1: 😶‍🌫️、🧔🏻‍♀️、🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲、🥷🏿、🐻‍❄️
    • 12.1: 🧑🏻‍🦰、🧑🏿‍🦯、👩🏻‍🤝‍👩🏼
    • 12.0: 🦩、🦻🏿、👩🏼‍🤝‍👩🏻

emoji2 処理のオプション機能

アプリに emoji2 ライブラリを追加した後、このセクションで説明するオプション機能を追加できます。

別のフォントまたはダウンロード可能なフォントのプロバイダを使用するように emoji2 を構成する

別のフォントまたはダウンロード可能なフォントのプロバイダを使用するように emoji2 を構成する手順は次のとおりです。

  1. マニフェストに以下を追加して、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>
  2. 次のいずれかを行います。

    • 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 に設定すると、EmojiCompatEmojiSpan のバックグラウンドを描画します。このメソッドは主にデバッグ目的で使用します。
  • setEmojiSpanIndicatorColor: EmojiSpan を示す色を設定します。デフォルト値は GREEN です。
  • registerInitCallback(): EmojiCompat の初期化の状態をアプリに通知します。

初期化リスナーを追加する

EmojiCompat クラスと EmojiCompat.Config クラスには、初期化コールバックの登録と登録解除を行うための registerInitCallback() メソッドと unregisterInitCallback() メソッドが用意されています。アプリはこれらのコールバックを使用して、EmojiCompat が初期化されるまで待機してから、バックグラウンド スレッドまたはカスタムビューで絵文字を処理します。

これらのメソッドを使用するには、EmojiCompat.InitCallback クラスのインスタンスを作成します。これらのメソッドを呼び出して、EmojiCompat.InitCallback クラスのインスタンスを渡します。初期化が成功すると、EmojiCompat クラスは onInitialized() メソッドを呼び出します。ライブラリの初期化に失敗した場合、EmojiCompat クラスは onFailed() メソッドを呼び出します。

初期化状態を任意の時点で確認するには、getLoadState() メソッドを呼び出します。このメソッドは、LOAD_STATE_LOADINGLOAD_STATE_SUCCEEDEDLOAD_STATE_FAILED のいずれかの値を返します。

emoji2 がバンドルされたフォントのサポート

emoji2-bundled アーティファクトを使用すると、絵文字フォントをアプリにバンドルできます。ただし、NotoColorEmoji フォントは 10 MB を超えるため、可能であればダウンロード可能なフォントを使用することを強くおすすめします。emoji2-bundled アーティファクトは、ダウンロード可能なフォントをサポートしていないデバイス上のアプリを対象としています。

emoji2-bundled アーティファクトを使用する手順は次のとおりです。

  1. emoji2-bundled アーティファクトと emoji2 アーティファクトを含めます。

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. バンドルされた構成を使用するように emoji2 を構成します。

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))
    

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
    
  3. AppCompat の有無にかかわらず emojicompat を含めるため、前述の手順に沿って統合をテストします。テスト文字列が正しく表示されることを確認します。

    • 14.0: 🫠、🫱🏼‍🫲🏿、🫰🏽
    • 13.1: 😶‍🌫️、🧔🏻‍♀️、🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲、🥷🏿、🐻‍❄️
    • 12.1: 🧑🏻‍🦰、🧑🏿‍🦯、👩🏻‍🤝‍👩🏼
    • 12.0: 🦩、🦻🏿、👩🏼‍🤝‍👩🏻

EmojiCompat 自動構成の影響

システムは、起動ライブラリ EmojiCompatInitializerDefaultEmojiCompatConfig を使用してデフォルト構成を適用します。

アプリで最初のアクティビティが再開すると、イニシャライザが絵文字フォントの読み込みをスケジュールします。この短い遅延により、バックグラウンド スレッドでのフォントの読み込みによる遅延を発生させることなく、アプリの初期コンテンツを表示できます。

DefaultEmojiCompatConfig は、Google Play 開発者サービスなど、EmojiCompat インターフェースを実装する、システムによってインストールされるダウンロード可能なフォントのプロバイダを探します。Google Play 開発者サービスを備えたデバイスでは、Google Play 開発者サービスを使用してフォントが読み込まれます。

イニシャライザは、絵文字フォントを読み込むバックグラウンド スレッドを作成します。フォントのダウンロードがタイムアウトするまでに最大で 10 秒かかることがあります。フォントがダウンロードされた後、バックグラウンド スレッドで EmojiCompat を初期化するのに約 150 ミリ秒かかります。

EmojiCompatInitializer を無効にした場合でも、EmojiCompat の初期化を遅延してください。EmojiCompat を手動で設定する場合は、アプリの最初の画面が表示された後に EmojiCompat.load() を呼び出して、最初の画面読み込み時のバックグラウンドでの競合を回避します。

読み込み後、EmojiCompat は約 300 KB の RAM を使用して絵文字メタデータを保持します。