ダウンロード可能なフォント

Android 8.0(API レベル 26)と Android サポート ライブラリ 26 は、アプリにフォント ファイルをバンドルするかアプリにフォントをダウンロードさせる代わりに、プロバイダ アプリケーションからフォントをリクエストする API をサポートしています。この機能は、Android API バージョン 14 以降を搭載するデバイスで、サポート ライブラリ 26 を介して使用できます。

この機能(「ダウンロード可能なフォント」機能)には、次のようなメリットがあります。

  • アプリのサイズが小さくなる
  • アプリのインストール成功率が上がる
  • 複数のアプリがプロバイダを介して同じフォントを共有できるので、システム全体の健全性が向上する。これにより、ユーザーのモバイルデータ、スマートフォンのメモリ、ディスク容量を節約できます。このモデルでは、フォントは必要に応じてネットワーク経由で取得されます。

以下の関連リソースもご覧ください。

  • ダウンロード可能なフォントのサンプルアプリ(Java | Kotlin

ダウンロード可能なフォントの仕組み

フォント プロバイダは、フォントを取得してローカル キャッシュに保存し、他のアプリがフォントをリクエストおよび共有できるようにするアプリです。図 1 はこのプロセスを示しています。

絵文字互換プロセスのメイン コンポーネント
図 1. ダウンロード可能なフォントのプロセス

基本情報

ダウンロード可能なフォント機能は、次の方法で使用できます。

Android Studio と Google Play 開発者サービスを介してダウンロード可能なフォントを使用する

Android Studio 3.0 以降を使用して、アプリがフォントをダウンロードするように設定できます。ダウンロード可能なフォント機能を利用するにあたっては、Google Play 開発者サービスのフォント プロバイダを使用できます。

: Google Fonts プロバイダを使用するには、デバイスに Google Play 開発者サービス バージョン 11 以降をインストールしている必要があります。

  1. Layout Editor で TextView を選択し、[Properties] で [fontFamily] > [More Fonts] を選択します。
    Layout Editor
    図 2. Layout Editor を使用する

    [Resources] ウィンドウが表示されます。

  2. [Source] のプルダウン リストで [Google Fonts] を選択します。
  3. [Fonts] ボックスでフォントを選択します。
  4. [Create downloadable font] を選択して [OK] をクリックします。

    : アプリにフォントをバンドルするには、[Add font to project] を選択します。

    Layout Editor
    図 3. [Resources] ウィンドウからフォントを選択する
  5. Android Studio は、アプリでフォントを正しくレンダリングするために必要な関連 XML ファイルを自動的に生成します。

    Layout Editor
    図 4. フォント ファイルのプレビュー

プログラムを介してダウンロード可能なフォントを使用する

Android 8.0(API レベル 26)より前のバージョンでは、サポート ライブラリ 26.0 により、ダウンロード可能なフォントの完全なサポートが提供されます。サポート ライブラリの使用方法については、サポート ライブラリのダウンロード可能なフォントのセクションをご覧ください。

プログラムを介してダウンロード可能なフォント機能を使用するには、キーとなる次の 2 つのクラスを操作する必要があります。

  • android.graphics.fonts.FontRequest: このクラスにより、フォント リクエストを作成できます。
  • FontsContract: このクラスにより、フォント リクエストに基づいて新しい Typeface オブジェクトを作成できます。

アプリは、FontsContract API を使用してフォント プロバイダからフォントを取得します。各プロバイダには、サポートされる Android バージョンとクエリ言語について固有の制限があります。Android のバージョンとクエリの形式については、プロバイダのドキュメントをご覧ください。

フォントをダウンロードするには、次の手順に従います。

  1. android.graphics.fonts.FontRequest クラスのインスタンスを作成し、プロバイダのフォントをリクエストします。リクエストを作成するには、以下のパラメータを渡します。
    • フォント プロバイダの権限
    • プロバイダの ID を確認するためのフォント プロバイダ パッケージ
    • フォントの文字列クエリ。クエリの形式については、フォント プロバイダのドキュメント(Google Fonts など)をご覧ください。
    • プロバイダの ID を確認するための、証明書のハッシュセットのリスト。

      : プリインストール済みのプロバイダのフォントをリクエストする場合、証明書の追加は不要です。一方、サポート ライブラリを介してフォントをリクエストする場合は、常に証明書を指定する必要があります。

    Kotlin

    val request = FontRequest(
            "com.example.fontprovider.authority",
            "com.example.fontprovider",
            "my font",
            certs
    )
    

    Java

    FontRequest request = new FontRequest("com.example.fontprovider",
                       "com.example.fontprovider", "my font", certs);
    

    : フォント プロバイダからパラメータ値を受け取ることができます。Android Studio では、UI でサポートされているプロバイダの場合、値が自動的に入力されます。

  2. FontsContract.FontRequestCallback クラスのインスタンスを作成します。
  3. onTypefaceRetrieved() メソッドをオーバーライドして、フォント リクエストが完了したことを示します。取得したフォントをパラメータとして指定します。このメソッドを使用して、必要に応じてフォントを設定できます。たとえば、TextView でフォントを設定できます。
  4. onTypefaceRequestFailed() メソッドをオーバーライドして、フォント リクエスト プロセスのエラーに関する情報を取得します。エラーコードの詳細については、error code constants をご覧ください。
  5. FontsContract.requestFont() メソッドを呼び出して、フォント プロバイダからフォントを取得します。このメソッドは、フォントがキャッシュに存在するかどうかを判定するためのチェックを開始します。フォントがローカルで利用できない場合は、フォント プロバイダを呼び出して非同期でフォントを取得し、結果をコールバックに渡します。以下のパラメータを渡します。
    • Context クラスのインスタンス
    • android.graphics.fonts.FontRequest クラスのインスタンス
    • フォント リクエストの結果を受け取るコールバック
    • スレッド上のフォントを取得するハンドラ
    • : このハンドラがユーザー インターフェースのスレッド ハンドラでないことを確認してください。

次のサンプルコードは、ダウンロード可能なフォントのプロセス全体を示しています。

Kotlin

val request = FontRequest(
        "com.example.fontprovider.authority",
        "com.example.fontprovider",
        "my font",
        certs
)
val callback = object : FontsContract.FontRequestCallback() {

    override fun onTypefaceRetrieved(typeface: Typeface) {
        // Your code to use the font goes here
        ...
    }

    override fun onTypefaceRequestFailed(reason: Int) {
        // Your code to deal with the failure goes here
        ...
    }
}
FontsContract.requestFonts(context, request, handler, null, callback)

Java

FontRequest request = new FontRequest("com.example.fontprovider.authority",
        "com.example.fontprovider", "my font", certs);
FontsContract.FontRequestCallback callback =
    new FontsContract.FontRequestCallback() {
        @Override
        public void onTypefaceRetrieved(Typeface typeface) {
            // Your code to use the font goes here
            ...
        }

        @Override
        public void onTypefaceRequestFailed(int reason) {
            // Your code to deal with the failure goes here
            ...
        }
};
FontsContract.requestFonts(context, request, handler, null, callback);

フォント プロバイダからフォントをダウンロードする方法の詳細については、ダウンロード可能なフォントのサンプルアプリ(Java | Kotlin)をご覧ください。

サポート ライブラリを介してダウンロード可能なフォントを使用する

サポート ライブラリ 26 は、Android API バージョン 14 以降を搭載しているデバイスで、ダウンロード可能なフォント機能をサポートします。android.support.v4.provider パッケージには、下位互換性のあるダウンロード可能なフォント機能のサポートを実装するクラス FontsContractCompat および FontRequest が含まれています。サポート ライブラリ クラスには、フレームワークに類似したメソッドが含まれています。フォントをダウンロードするプロセスも、フォントのダウンロード セクションで説明されているプロセスに似ています。

サポート ライブラリを使用してフォントをダウンロードするには、FontsContractCompat および FontRequest クラスを android.support.v4.provider パッケージからインポートします。FontsContract および android.graphics.fonts.FontRequest フレームワーク クラスではなく、上記のクラスのインスタンスを作成します。

: サポート ライブラリを介してフォントをリクエストする場合は、証明書を指定する必要があります。これは、プリインストール済みのフォント プロバイダを使用する場合も同様です。

サポート ライブラリの依存関係を追加する

FontsContractCompat および FontRequest クラスを使用するには、開発環境内でアプリ プロジェクトのクラスパス依存関係を変更する必要があります。

アプリのプロジェクトにサポート ライブラリを追加するには:

  1. アプリの build.gradle ファイルを開きます。
  2. サポート ライブラリを dependencies セクションに追加します。

Groovy

dependencies {
    ...
    implementation "com.android.support:support-compat:28.0.0"
}

Kotlin

dependencies {
    ...
    implementation("com.android.support:support-compat:28.0.0")
}

ダウンロード可能なフォントを XML のリソースとして使用する

Android 8.0(API レベル 26)とサポート ライブラリ 26 には、カスタム フォントを XML レイアウトのリソースとして迅速かつ簡単に宣言する方法が用意されています。つまり、フォントをアセットとしてバンドルする必要はありません。テーマ全体にカスタム フォントを定義できます。Bold、Medium、Light など、複数のウェイトとスタイルがあれば、それによってユーザビリティが向上します。

  1. res/font フォルダに新しい XML ファイルを作成します。
  2. 次のサンプル XML ファイルに示すように、<font-family> ルート要素を追加してフォント関連の属性を設定します。
  3. <?xml version="1.0" encoding="utf-8"?>
    <font-family xmlns:android="http://schemas.android.com/apk/res/android"
            android:fontProviderAuthority="com.example.fontprovider.authority"
            android:fontProviderPackage="com.example.fontprovider"
            android:fontProviderQuery="example font"
            android:fontProviderCerts="@array/certs">
    </font-family>
    
  4. レイアウト XML ファイルで @font/font_file_name としてファイルを参照します。getFont() メソッドを使用して、プログラムでファイルを取得することもできます。たとえば、getFont(R.font.font_file_name) を使用します。

マニフェストでフォントを事前に宣言する

レイアウトのインフレーションとリソースの取得は同期タスクです。デフォルトでは、最初にフォントを取得しようとすると、フォント プロバイダへのリクエストがトリガーされるため、最初のレイアウト時間が長くなります。こうした遅延を避けるには、取得する必要があるフォントをマニフェストで事前に宣言します。システムがプロバイダからフォントを取得すると、フォントがすぐに使用可能になります。フォントの取得に予想より時間がかかる場合、システムは取得プロセスを中止し、デフォルトのフォントを使用します。

マニフェストでフォントを事前に宣言するには、次の手順に従います。

  1. res/values/arrays.xml でリソース配列を作成し、プリフェッチするダウンロード可能なフォントを宣言します。
  2. res/values/arrays.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <array name="preloaded_fonts">
            <item>@font/font1</item>
            <item>@font/font2</item>
        </array>
    </resources>
    
  3. meta-data タグを使用して、マニフェストでリソース配列を宣言します。
  4. <meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
    

証明書を追加する

フォント プロバイダがプリインストールされていない場合、またはサポート ライブラリを使用している場合は、フォント プロバイダが署名した証明書を宣言する必要があります。システムは、証明書を使用してフォント プロバイダの ID を検証します。

: Android Studio のフォント選択ツールを使用すると、Google Play 開発者サービス プロバイダを示す値を自動的に入力できます。Android Studio を使用してフォントをダウンロードする方法については、Android Studio と Google Play 開発者サービスを介してダウンロード可能なフォントを使用するをご覧ください。

証明書を追加するには、次の手順に従います。

  1. 証明書の詳細を含む文字列配列を作成します。証明書の詳細については、フォント プロバイダのドキュメントをご覧ください。
  2. <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="certs">
           <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item>
        </string-array>
    </resources>
    
  3. fontProviderCerts 属性を配列に設定します。
  4. android:fontProviderCerts="@array/certs"
    

    : プロバイダに証明書の複数のセットがある場合は、文字列配列の配列を定義できます。