ダウンロード可能なフォントを使用する

Compose を試す
Jetpack Compose は Android で推奨される UI ツールキットです。Compose でテキストを使用する方法について学習します。

ダウンロード可能フォント機能を使用すると、API は、ファイルをアプリにバンドルしたり、アプリでフォントをダウンロードさせたりする代わりに、プロバイダ アプリにフォントをリクエストできるようになります。ダウンロード可能フォントは、Android API バージョン 14 以降を搭載しているデバイスで、AndroidX Core ライブラリを介して利用できます。

ダウンロード可能フォントには次のようなメリットがあります。

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

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

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

絵文字互換プロセスの主なコンポーネントを示す画像
図 1. ダウンロード可能フォントのプロセス

基本情報

ダウンロード可能なフォント機能は次の方法で使用できます。詳細については、後のセクションで説明します。

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

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

  1. Layout EditorTextView を選択します。次に、[Attributes] で、[fontFamily] > [More Fonts] を選択します。
    Android Studio の Layout Editor を示す画像
    図 2.Layout Editor を使用する。
    [Resources] ウィンドウが表示されます。
  2. [ソース] メニューで、[Google Fonts] を選択します。
  3. [フォント] ボックスの [ダウンロード可能] でフォントを選択します。
  4. [Create downloadable font] を選択して [OK] をクリックします。
    [リソース] ウィンドウからフォントを選択する方法を示す画像
    図 3.[Resources] ウィンドウからのフォントの選択
  5. Android Studio は、アプリでフォントを正しくレンダリングするために必要な関連 XML ファイルを自動的に生成します。

    フォントをプレビューする方法を示す画像
    図 4.フォント ファイルをプレビューします。

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

Android 8.0(API レベル 26)以降、AndroidX Core はダウンロード可能フォントを完全にサポートしています。AndroidX Core ライブラリの使用方法については、このページのダウンロード可能なフォント AndroidX Core ライブラリのセクションをご覧ください。

「ダウンロード可能なフォント」機能をプログラムで使用するには、次の 2 つの主要なクラスを操作します。

アプリは、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);
    
  2. FontsContract.FontRequestCallback クラスのインスタンスを作成します。
  3. onTypefaceRetrieved() メソッドをオーバーライドして、フォント リクエストが完了したことを示します。取得したフォントをパラメータとして指定します。 このメソッドを使用して、必要に応じてフォントを設定できます。たとえば、TextView でフォントを設定できます。
  4. onTypefaceRequestFailed() メソッドをオーバーライドして、フォント リクエスト プロセスのエラーに関する情報を受け取ります。エラーコードの詳細については、エラーコード定数をご覧ください。
  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);

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

AndroidX Core でダウンロード可能フォントを使用する

AndroidX Core は、Android API バージョン 14 以降を搭載したデバイスで「ダウンロード可能フォント」機能をサポートしています。androidx.core.provider パッケージには、下位互換性のあるダウンロード可能フォント機能のサポートを実装する FontsContractCompat クラスと FontRequest クラスが含まれています。AndroidX クラスには、フレームワーク メソッドに似たメソッドが含まれており、フォントをダウンロードするプロセスは、このページのダウンロード可能フォントをプログラムで使用するセクションで説明されているプロセスに似ています。

AndroidX を使用してフォントをダウンロードするには、androidx.core.provider パッケージから FontsContractCompat クラスと FontRequest クラスをインポートします。FontsContract および android.graphics.fonts.FontRequest フレームワーク クラスの代わりに、これらのクラスのインスタンスを作成します。

AndroidX Core の依存関係を追加する

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

AndroidX Core をアプリ プロジェクトに追加するには、アプリの build.gradle ファイルに次の依存関係を追加します。

Groovy

dependencies {
    ...
    implementation "androidx.core:core-ktx:2.2.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.core:core-ktx:2.2.0")
}

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

Android 8.0(API レベル 26)と AndroidX Core では、XML レイアウト内のリソースとしてカスタム フォントをすばやく簡単に宣言できます。つまり、フォントをアセットとしてバンドルする必要はありません。テーマ全体にカスタム フォントを定義すると、太字、中程度、薄いなど、複数の太さやスタイルでユーザビリティが向上します。

  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(R.font.font_file_name) など、getFont() メソッドを使用してプログラムでファイルを取得することもできます。

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

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

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

  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" />
    

証明書を追加

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

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

  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"
    

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

Compose 1.2-alpha07 以降では、Compose アプリで Downloadable Fonts API を使用して Google Fonts を非同期でダウンロードしてアプリで使用できます。詳細については、Compose のダウンロード可能フォントのドキュメントをご覧ください。