La fonctionnalité Polices téléchargeables permet aux API de demander des polices à une application du fournisseur au lieu de regrouper des fichiers dans l'application ou d'autoriser celle-ci à télécharger des polices. Les polices téléchargeables sont disponibles sur les appareils exécutant l'API Android version 14 ou ultérieure via la bibliothèque AndroidX Core.
Les polices téléchargeables offrent les avantages suivants:
- Réduit la taille de l'application, ce qui augmente le taux de réussite d'installation de l'application.
- Améliore l'état général du système, car plusieurs applications peuvent partager la même police via un fournisseur. Cela permet d'économiser des données mobiles, de la mémoire du téléphone et de l'espace disque. Dans ce modèle, la police est récupérée sur le réseau si nécessaire.
Comment fonctionnent les polices téléchargeables ?
Un fournisseur de polices est une application qui récupère des polices et les met en cache localement afin que d'autres applications puissent demander et partager des polices. La figure suivante illustre le processus.
Principes de base
Vous pouvez utiliser la fonctionnalité des polices téléchargeables des manières suivantes, qui sont décrites en détail dans les sections suivantes:
- Utiliser Android Studio et les services Google Play
- Par programmation
- Utiliser la bibliothèque principale AndroidX
Utiliser des polices téléchargeables avec Android Studio et les services Google Play
Vous pouvez configurer votre application pour télécharger des polices à l'aide d'Android Studio 3.0 ou version ultérieure. Pour vous aider à vous familiariser avec les fonctionnalités des polices téléchargeables, vous pouvez utiliser le fournisseur de polices des services Google Play.
- Dans l'éditeur de mise en page, sélectionnez un
TextView
. Ensuite, sous Attributs, sélectionnez fontFamily > Autres polices. La fenêtre Ressources s'affiche. - Dans le menu Source, sélectionnez Google Fonts.
- Dans la zone Polices, sélectionnez une police dans la zone "Téléchargeable".
- Sélectionnez Créer une police téléchargeable, puis cliquez sur OK.
Android Studio génère automatiquement les fichiers XML pertinents qui sont nécessaires pour afficher la police correctement dans votre application.
Utiliser des polices téléchargeables par programmation
À partir d'Android 8.0 (niveau d'API 26), AndroidX Core est entièrement compatible avec les polices téléchargeables. Pour en savoir plus sur l'utilisation de la bibliothèque AndroidX Core, consultez la section Bibliothèque de polices téléchargeables AndroidX Core sur cette page.
Pour utiliser la fonctionnalité des polices téléchargeables par programmation, interagissez avec deux classes clés:
android.graphics.fonts.FontRequest
: cette classe vous permet de créer une requête de police.FontsContractCompat
: cette classe vous permet de créer un objetTypeface
en fonction de la requête de police.
Votre application récupère les polices auprès du fournisseur de polices à l'aide de l'API FontsContract
. Chaque fournisseur possède son propre ensemble de restrictions sur les versions d'Android et le langage de requête qu'il accepte. Pour en savoir plus sur les versions d'Android et le format de requête, consultez la documentation de votre fournisseur.
Pour télécharger une police, procédez comme suit:
- Créez une instance de la classe
android.graphics.fonts.FontRequest
pour demander la police au fournisseur. Pour créer une requête, transmettez les paramètres suivants :- L'autorité du fournisseur de polices.
- Package du fournisseur de polices permettant de vérifier l'identité du fournisseur.
- Requête de chaîne de la police. Pour en savoir plus sur les formats de requêtes, consultez la documentation de votre fournisseur de polices, par exemple Google Fonts.
- Liste d'ensembles de hachages des certificats permettant de vérifier l'identité du fournisseur.
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);
- Créez une instance de la classe
FontsContract.FontRequestCallback
. - Ignorez la méthode
onTypefaceRetrieved()
pour indiquer que la demande de police est terminée. Indiquez la police récupérée en tant que paramètre. Vous pouvez utiliser cette méthode pour définir la police selon vos besoins. Par exemple, vous pouvez définir la police sur un élémentTextView
. - Ignorez la méthode
onTypefaceRequestFailed()
pour recevoir des informations sur les erreurs dans le processus de demande de police. Pour plus d'informations sur les codes d'erreur, reportez-vous aux constantes de code d'erreur. - Appelez la méthode
FontsContract.requestFont()
pour récupérer la police auprès du fournisseur de polices. Cette méthode lance une vérification pour déterminer si la police existe dans le cache. Si la police n'est pas disponible localement, elle appelle le fournisseur de polices, la récupère de manière asynchrone et transmet le résultat au rappel. Transmettez les paramètres suivants :- Instance de la classe
Context
- Instance de la classe
android.graphics.fonts.FontRequest
- Un rappel pour recevoir les résultats de la requête de police
- Un gestionnaire pour récupérer les polices sur un thread
- Instance de la classe
L'exemple de code suivant illustre le processus global des polices téléchargeables:
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);
Pour en savoir plus sur le téléchargement d'une police auprès d'un fournisseur de polices, consultez l'application exemple DownloadableFonts.
Utiliser des polices téléchargeables avec AndroidX Core
AndroidX Core prend en charge la fonctionnalité des polices téléchargeables sur les appareils exécutant l'API Android version 14 ou ultérieure. Le package androidx.core.provider
contient les classes FontsContractCompat
et FontRequest
pour implémenter la compatibilité avec la fonctionnalité de polices téléchargeables rétrocompatible. Les classes AndroidX contiennent des méthodes semblables aux méthodes du framework. Le processus de téléchargement des polices est semblable à celui décrit dans la section de cette page sur l'utilisation programmatique des polices téléchargeables.
Pour télécharger des polices à l'aide d'AndroidX, importez les classes FontsContractCompat
et FontRequest
à partir du package androidx.core.provider
. Créez des instances de ces classes au lieu des classes de framework FontsContract
et android.graphics.fonts.FontRequest
.
Ajouter la dépendance de base AndroidX
Pour utiliser les classes FontsContractCompat
et FontRequest
, vous devez modifier les dépendances classpath de votre projet d'application dans votre environnement de développement.
Pour ajouter AndroidX Core à votre projet d'application, ajoutez la dépendance suivante au fichier build.gradle
de votre application:
Groovy
dependencies { ... implementation "androidx.core:core-ktx:2.2.0" }
Kotlin
dependencies { ... implementation("androidx.core:core-ktx:2.2.0") }
Utiliser des polices téléchargeables comme ressources dans XML
Android 8.0 (niveau d'API 26) et AndroidX Core offrent un moyen plus rapide et plus pratique de déclarer une police personnalisée en tant que ressource dans la mise en page XML. Cela signifie qu'il n'est pas nécessaire de regrouper la police en tant qu'élément. Vous pouvez définir une police personnalisée pour l'ensemble de votre thème, ce qui accélère la facilité d'utilisation de plusieurs épaisseurs et styles (gras, moyen ou clair, le cas échéant).
- Créez un fichier XML dans le dossier
res/font
. - Ajoutez un élément racine
<font-family>
et définissez les attributs liés à la police, comme indiqué dans l'exemple de fichier XML suivant: - Faites référence au fichier en tant que
@font/font_file_name
dans le fichier XML de mise en page. Vous pouvez également utiliser la méthodegetFont()
pour récupérer le fichier par programmation, par exemplegetFont(R.font.font_file_name)
.
<?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>
Prédéclarer les polices dans le fichier manifeste
Le gonflage de la mise en page et la récupération des ressources sont des tâches synchrones. Par défaut, la première tentative de récupération des polices déclenche une requête au fournisseur de polices, ce qui augmente le temps de première mise en page. Pour éviter tout retard, vous pouvez prédéclarer les polices à récupérer dans votre fichier manifeste. Une fois que le système a récupéré la police auprès du fournisseur, elle est disponible immédiatement. Si la récupération de la police prend plus de temps que prévu, le système annule le processus et utilise la police par défaut.
Pour prédéclarer des polices dans le fichier manifeste, procédez comme suit:
- Créez un tableau de ressources dans
res/values/arrays.xml
et déclarez les polices que vous souhaitez précharger. - Utilisez une balise
meta-data
pour déclarer le tableau de ressources dans votre fichier manifeste.
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>
<meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
Ajouter des certificats
Lorsqu'aucun fournisseur de polices n'est préinstallé ou si vous utilisez la bibliothèque AndroidX Core, déclarez les certificats avec lesquels le fournisseur de polices est signé. Le système utilise les certificats pour vérifier l'identité du fournisseur de polices.
Pour ajouter des certificats, procédez comme suit:
- Créez un tableau de chaînes contenant les détails du certificat. Pour en savoir plus sur les détails du certificat, consultez la documentation de votre fournisseur de polices.
- Définissez l'attribut
fontProviderCerts
sur le tableau.
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="certs"> <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item> </string-array> </resources>
android:fontProviderCerts="@array/certs"
Polices téléchargeables dans Compose
À partir de Compose 1.2-alpha07, vous pouvez utiliser l'API Downloadable Fonts dans votre application Compose pour télécharger Google Fonts de manière asynchrone et les utiliser dans votre application. Pour en savoir plus, consultez la documentation sur les polices téléchargeables Compose.