Usar fuentes descargables

Prueba el estilo de Compose
Jetpack Compose es el kit de herramientas de IU recomendado para Android. Aprende a usar texto en Compose.

La función Fuentes para descargar permite que las APIs soliciten fuentes de una aplicación de proveedor en lugar de agrupar archivos en la app o permitir que esta descargue fuentes. La función Fuentes para descargar está disponible en dispositivos que ejecutan la versión 14 de la API de Android y versiones posteriores a través de la biblioteca de AndroidX Core.

La función Fuentes para descargar ofrece los siguientes beneficios:

  • Reduce el tamaño de la app y, por lo tanto, aumenta la tasa de éxito de la instalación de la app.
  • Mejora el estado general del sistema, ya que varias apps pueden compartir la misma fuente a través de un proveedor. Esto les permite a los usuarios ahorrar datos móviles, memoria del teléfono y espacio en disco. En este modelo, la fuente se obtiene a través de la red cuando es necesario.
Si deseas obtener experiencia práctica con la función Fuentes para descargar, consulta la app de ejemplo DownloadableFonts.

¿Cómo funciona Fuentes para descargar?

Un proveedor de fuentes es una aplicación que recupera fuentes y las almacena en caché de forma local para que otras apps puedan solicitarlas y compartirlas. En la siguiente figura, se ilustra el proceso.

Imágenes que muestran los componentes principales del proceso de compatibilidad con Emojis
Figura 1: Proceso de la función Fuentes para descargar.

Conceptos básicos

Puedes usar la función Fuentes para descargar de las siguientes maneras, que se analizan en detalle en secciones posteriores:

Cómo usar la función Fuentes para descargar con Android Studio y Servicios de Google Play

Puedes configurar tu aplicación para que descargue fuentes con Android Studio 3.0 o versiones posteriores. Para ayudarte a comenzar a usar las funciones Fuentes para descargar, puedes usar el proveedor de fuentes de los Servicios de Google Play.

  1. En el editor de diseño, selecciona un TextView. Luego, en Attributes, selecciona fontFamily > More Fonts.
    Imagen que muestra el editor de diseño de Android Studio
    Figura 2: Usando el editor de diseño.
    Aparecerá la ventana Resources.
  2. En el menú Source, selecciona Google Fonts.
  3. En el cuadro Fuentes, selecciona una fuente en el área "Descargable".
  4. Selecciona Crear fuente descargable y haz clic en Aceptar.
    Una imagen que muestra cómo seleccionar fuentes en la ventana Recursos
    Figura 3: Selección de una fuente en la ventana Resources.
  5. Android Studio genera automáticamente los archivos en formato XML relevantes que se necesitan para renderizar la fuente de forma correcta en tu app.

    Una imagen que muestra cómo obtener una vista previa de las fuentes
    Figura 4: Vista previa del archivo de fuentes

Cómo usar la función Fuentes para descargar de manera programática

A partir de Android 8.0 (nivel de API 26), AndroidX Core ofrece compatibilidad total con la función Fuentes para descargar. Para obtener más información sobre el uso de la biblioteca de AndroidX Core, consulta la sección de la biblioteca de AndroidX Core de fuentes descargables en esta página.

Para usar la función Fuentes para descargar de manera programática, interactúa con dos clases clave:

Tu app recupera fuentes del proveedor mediante la API FontsContract. Cada proveedor tiene su propio conjunto de restricciones en las versiones de Android y el idioma de consulta que admite. Para obtener más información sobre las versiones de Android y el formato de consulta, consulta la documentación de tu proveedor.

Para descargar una fuente, sigue estos pasos:

  1. Crea una instancia de la clase android.graphics.fonts.FontRequest para solicitar la fuente al proveedor. Para crear una solicitud, pasa los siguientes parámetros:
    • Es la autoridad del proveedor de fuentes.
    • El paquete del proveedor de fuentes para verificar su identidad
    • La búsqueda de string de la fuente Para obtener más información sobre los formatos de consulta, consulta la documentación de tu proveedor de fuentes, como Google Fonts.
    • Una lista de conjuntos de hashes para los certificados a fin de verificar la identidad del proveedor.

    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. Crea una instancia de la clase FontsContract.FontRequestCallback.
  3. Anula el método onTypefaceRetrieved() para indicar que la solicitud de fuente está completa. Proporciona la fuente recuperada como parámetro. Puedes usar este método para configurar la fuente según sea necesario. Por ejemplo, puedes configurar la fuente en un objeto TextView.
  4. Anula el método onTypefaceRequestFailed() para recibir información sobre errores en el proceso de solicitud de fuentes. Para obtener más información sobre los códigos de error, consulta las constantes de código de error.
  5. Llama al método FontsContract.requestFont() para recuperar la fuente del proveedor. El método inicia una verificació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 devolución de llamada. 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 fuente
    • Un controlador para recuperar fuentes en un subproceso

En el siguiente código de muestra, se ilustra el proceso general de la función Fuentes para descargar:

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);

Si deseas obtener más información para descargar una fuente de un proveedor de fuentes, consulta la app de ejemplo DownloadableFonts.

Cómo usar la función Fuentes descargables con AndroidX Core

AndroidX Core admite la función Fuentes para descargar en dispositivos que ejecutan la versión 14 o posterior de la API de Android. El paquete androidx.core.provider contiene las clases FontsContractCompat y FontRequest para implementar la compatibilidad retrocompatible de la función Fuentes para descargar. Las clases de AndroidX contienen métodos similares a los del framework, y el proceso para descargar fuentes es similar al que se describe en la sección de esta página sobre cómo usar fuentes descargables de manera programática.

Para descargar fuentes con AndroidX, importa las clases FontsContractCompat y FontRequest del paquete androidx.core.provider. Crea instancias de estas clases en lugar de las clases del framework FontsContract y android.graphics.fonts.FontRequest.

Cómo agregar una dependencia de AndroidX Core

Para usar las clases FontsContractCompat y FontRequest, debes modificar las dependencias de ruta de clase del proyecto de tu app en tu entorno de desarrollo.

Para agregar AndroidX Core al proyecto de tu aplicación, agrega la siguiente dependencia al archivo build.gradle de tu app:

Groovy

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

Kotlin

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

Cómo usar la función Fuentes para descargar como recursos en XML

Android 8.0 (nivel de API 26) y AndroidX Core ofrecen una forma más rápida y conveniente de declarar una fuente personalizada como un recurso en el diseño XML. Esto significa que no es necesario empaquetar la fuente como un recurso. Puedes definir una fuente personalizada para todo tu tema, lo que acelera la usabilidad para varios grosores y estilos, como negrita, media o clara, cuando se proporcionan.

  1. Crea un nuevo archivo en formato XML en la carpeta res/font.
  2. Agrega un elemento raíz <font-family> y configura los atributos relacionados con la fuente, como se muestra en el siguiente archivo en formato XML de ejemplo:
  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. Haz referencia al archivo como @font/font_file_name en el archivo en formato XML de diseño. También puedes usar el método getFont() para recuperar el archivo de manera programática, como getFont(R.font.font_file_name).

Cómo declarar previamente las fuentes en el manifiesto

El aumento del diseño y la recuperación de recursos son tareas sincrónicas. De forma predeterminada, el primer intento de recuperar fuentes activa una solicitud al proveedor de fuentes y, por lo tanto, aumenta el tiempo del primer diseño. Para evitar un retraso, puedes declarar previamente las fuentes que debes recuperar en tu manifiesto. Cuando el sistema recupera la fuente del proveedor, está disponible de inmediato. Si la recuperación de fuentes tarda más de lo esperado, el sistema anula el proceso de recuperación y usa la fuente predeterminada.

Para declarar previamente las fuentes en el manifiesto, completa los siguientes pasos:

  1. Crea un array de recursos en res/values/arrays.xml y declara las fuentes que deseas cargar previamente.
  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. Usa una etiqueta meta-data para declarar el array de recursos en tu manifiesto.
  4. <meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
    

Agregar certificados

Cuando un proveedor de fuentes no esté preinstalado o si usas la biblioteca de AndroidX Core, declara los certificados con los que está firmado el proveedor de fuentes. El sistema usa los certificados para verificar la identidad del proveedor de fuentes.

Sigue estos pasos para agregar certificados:

  1. Crea un array de strings con los detalles del certificado. Para obtener más información sobre los detalles del certificado, consulta la documentación de tu proveedor de fuentes.
  2. <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="certs">
           <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item>
        </string-array>
    </resources>
    
  3. Establece el atributo fontProviderCerts en el array.
  4. android:fontProviderCerts="@array/certs"
    

Fuentes descargables en Compose

A partir de Compose 1.2-alpha07, puedes usar la API de Downloadable Fonts en tu app de Compose para descargar Google Fonts de forma asíncrona y usarlas en tu app. Si deseas obtener más información, consulta la documentación sobre fuentes descargables de Compose.