Android 8.0 (nivel de API 26) y Android Support Library 26 introducen la compatibilidad con las API para solicitar fuentes a una aplicación del proveedor en lugar de incluir archivos en el APK o dejar que el APK descargue las fuentes. La función está disponible en los dispositivos que ejecutan las versiones 14 y superiores de la API de Android a través de la Support Library 26.
La función de fuentes descargables ofrece los siguientes beneficios:
- Reduce el tamaño del APK
- Aumenta la tasa de éxito de la instalación de la app
- Mejora la salud general del sistema ya que varios APK pueden compartir la misma fuente a través de un proveedor. Esto ahorra a los usuarios datos celulares, memoria del teléfono y espacio en el disco. En este modelo, la fuente se obtiene a través de la red cuando se necesita.
- La app de ejemplo Downloadable Fonts Java | Kotlin
- a través de Android Studio y los servicios de Google Play
- Programáticamente
- a través de la biblioteca de soporte
Consulte los siguientes recursos relacionados:
¿Cómo funciona Downloadable Fonts?
Un proveedor de fuentes es una aplicación que recupera fuentes y las almacena en caché localmente para que otras apps puedan solicitar y compartir fuentes. La figura 1 ilustra el proceso.
Los fundamentos
Puedes utilizar la función de fuentes descargables de las siguientes maneras:
Utilizando las fuentes descargables a través de Android Studio y los servicios de Google Play
Puede configurar su aplicación para descargar fuentes utilizando Android Studio 3.0 o superior. Para ayudarte a empezar con las funciones de las fuentes descargables, puedes utilizar el proveedor de fuentes de los servicios de Google Play.
Nota: Un dispositivo debe tener la versión 11 o superior de los servicios de Google Play para utilizar el proveedor de Google Fonts.
- En el Editor de diseño, seleccione un TextView y, a continuación, en Propiedades, seleccione fontFamily > Más fuentes.
Aparece la ventana Recursos.
- En la lista desplegable Fuente, seleccione Google Fonts.
- En el cuadro Fuentes, seleccione una fuente.
- Seleccione Crear fuente descargable y haga clic en Aceptar.
Nota: para agrupar la fuente en tu aplicación, selecciona Añadir fuente al proyecto.
Android Studio genera automáticamente los archivos XML pertinentes que son necesarios para renderizar la fuente correctamente en tu aplicación.
Utilización de fuentes descargables mediante programación
Antes de Android 8.0 (nivel de API 26), la biblioteca de soporte 26.0 proporciona compatibilidad total con las fuentes descargables. Para obtener más información sobre el uso de la biblioteca de soporte, vaya a la sección Biblioteca de soporte de fuentes descargables.
Para utilizar la función de Fuentes Descargables de forma programada, necesita interactuar con dos clases clave:
-
android.graphics.fonts.FontRequest
: Esta clase le permite crear una solicitud de fuentes. -
FontsContract
: Esta clase te permite crear un nuevo objetoTypeface
basado en la solicitud de fuentes.
Tu aplicación recupera las fuentes del proveedor de fuentes utilizando la API FontsContract
. Cada proveedor tiene su propio conjunto de restricciones sobre las versiones de Android y el lenguaje de consulta que admite. Para obtener más información sobre las versiones de Android y el formato de consulta, consulte la documentación de su proveedor.
Para descargar una fuente, realice los siguientes pasos:
- Cree una instancia de la clase
android.graphics.fonts.FontRequest
para solicitar la fuente al proveedor. Para crear una solicitud, pase los siguientes parámetros:- La autoridad del proveedor de fuentes
- El paquete del proveedor de fuentes para verificar la identidad del proveedor
- La cadena de consulta de la fuente. Para obtener más información sobre los formatos de consulta, consulte la documentación de su proveedor de fuentes, como Google Fonts.
- Una lista de conjuntos de hashes de los certificados para verificar la identidad del proveedor.
Nota: no es necesario añadir un certificado si solicita fuentes de proveedores preinstalados. Sin embargo, siempre debe proporcionar un certificado si solicita fuentes a través de la biblioteca de soporte.
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);
Nota: Puedes recibir los valores de los parámetros de tu proveedor de fuentes. Android Studio rellena automáticamente estos valores para los proveedores que admite en su interfaz de usuario.
- Cree una instancia de la clase
FontsContract.FontRequestCallback
.- Sustituya el método
onTypefaceRetrieved()
para indicar que la solicitud de fuente se ha completado. Proporcione la fuente recuperada como parámetro. Puede utilizar este método para establecer la fuente, según sea necesario. Por ejemplo, puede establecer la fuente en unTextView
- Sustituya el método
onTypefaceRequestFailed()
para recibir información sobre los errores en el proceso de solicitud de fuentes. Para obtener más información sobre los códigos de error, consulte elerror code constants
.- Llame al método
FontsContract.requestFont()
para recuperar la fuente del proveedor de fuentes. El método inicia una comprobación para determinar si la fuente existe en la caché. Si la fuente no está disponible localmente, llama al proveedor de fuentes, recupera la fuente de forma asíncrona y pasa el resultado a la llamada de retorno. Pasa los siguientes parámetros:- una instancia de la clase
Context
- una instancia de la clase
android.graphics.fonts.FontRequest
- una devolución de llamada para recibir los resultados de la solicitud de fuentes
- un manejador para obtener fuentes en un hilo
Nota: asegúrese de que este manejador no es el manejador de hilo de la interfaz de usuario.
El siguiente código de ejemplo ilustra el proceso general de Fuentes Descargables:
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);
Para obtener más información sobre cómo descargar una fuente de un proveedor de fuentes, consulte la aplicación de ejemplo Downloadable Fonts Java | Kotlin.
Utilización de Downloadable Fonts a través de la biblioteca de soporte
La biblioteca de soporte 26 proporciona soporte a la función Downloadable Fonts en dispositivos que ejecutan las versiones 14 o superiores de la API de Android. El paquete
android.support.v4.provider
contiene las clasesFontsContractCompat
yFontRequest
para implementar el soporte de la función Downloadable Fonts compatible con versiones anteriores. Las clases de la biblioteca de soporte contienen métodos similares a los del framework. El proceso de descarga de fuentes también es similar al mencionado en la sección Descarga de fuentes.Para descargar fuentes utilizando la biblioteca de soporte, importe las clases
FontsContractCompat
yFontRequest
del paqueteandroid.support.v4.provider
. Cree las instancias de estas clases en lugar de las clasesFontsContract
yandroid.graphics.fonts.FontRequest
del framework.Nota: debe proporcionar un certificado cuando solicite fuentes a través de la biblioteca de soporte. Esto es aplicable incluso para los proveedores de fuentes preinstalados.
Añadir dependencia de la biblioteca de soporte
Para utilizar las clases
FontsContractCompat
yFontRequest
, debes modificar las dependencias del classpath de tu proyecto de app dentro de tu entorno de desarrollo.Para añadir una biblioteca de apoyo a su proyecto de aplicación:
- Abra el archivo
build.gradle
de su aplicación. - Añada la biblioteca de soporte a la sección
dependencies
.
dependencies { ... compile "com.android.support:support-compat:28.0.0"}
Utilización de fuentes descargables como recursos en XML
Android 8.0 (nivel de API 26) y la biblioteca de soporte 26 ofrecen una forma más rápida y cómoda de declarar una fuente personalizada como recurso en el diseño XML. Esto significa que no es necesario agrupar la fuente como un recurso. Puede definir una fuente personalizada para todo su tema, lo que acelera la usabilidad para múltiples pesos y estilos, como Negrita, Media o Ligera, cuando se proporcionan.
- Cree un nuevo archivo XML en la carpeta
res/font
. - Añada el elemento raíz
<font-family>
y establezca los atributos relacionados con la fuente como se muestra en el siguiente archivo XML de ejemplo: - Haga referencia al archivo como @font/nombre_del_archivo_de_la_fuente en el archivo XML de diseño. También puede utilizar el método
getFont()
para recuperar el archivo mediante programación. Por ejemplo,getFont(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>
Pre-declaración de fuentes en el manifiesto
La inflación del diseño y la recuperación de recursos son tareas sincrónicas. Por defecto, el primer intento de recuperar las fuentes desencadena una petición al proveedor de fuentes, y por lo tanto aumenta el primer tiempo de maquetación. Para evitar el retraso, puede declarar previamente las fuentes que necesitan ser recuperadas en su manifiesto. Después de que el sistema recupere la fuente del proveedor, estará disponible inmediatamente. Si la recuperación de la fuente tarda más de lo esperado, el sistema aborta el proceso de obtención y utiliza la fuente predeterminada.
Para predefinir las fuentes en el manifiesto, realice los siguientes pasos:
- Cree una matriz de recursos en
res/values/arrays.xml
y declare las fuentes descargables que desea preobtener. - Usa una etiqueta
meta-data
para declarar la matriz de recursos en tu manifiesto.
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" />
Añadir certificados
Cuando un proveedor de fuentes no está preinstalado o si está utilizando la biblioteca de soporte, debe declarar los certificados con los que está firmado el proveedor de fuentes. El sistema utiliza los certificados para verificar la identidad del proveedor de fuentes.
Nota: Android Studio puede rellenar automáticamente los valores del proveedor de servicios de Google Play si utiliza la herramienta de selección de fuentes en Android Studio. Para obtener más información sobre el uso de Android Studio para descargar fuentes, vaya a la sección Uso de fuentes descargables a través de Android Studio y servicios de Google Play.
Realice los siguientes pasos para añadir certificados:
- Cree una matriz de cadenas con los detalles del certificado. Para obtener más información sobre los detalles del certificado, consulte la documentación de su proveedor de fuentes.
- Configure el atributo
fontProviderCerts
en el array.
<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="certs"> <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item> </string-array></resources>
android:fontProviderCerts="@array/certs"
Nota: Si el proveedor tiene más de un conjunto de certificados, puedes definir un array de arrays de cadenas.