Fuentes para descargar

Android 8.0 (nivel de API 26) y la biblioteca de compatibilidad de Android 26 incluyen compatibilidad para API a fin de solicitar fuentes de una aplicación de proveedor en lugar de agrupar archivos en la app o permitir que esta descargue fuentes. La función está disponible en dispositivos que ejecutan la versión 14 y posteriores de las API de Android a través de la biblioteca de compatibilidad 26.

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

  • Reduce el tamaño de la app.
  • Aumenta el índice de éxito de la instalación de apps.
  • Mejora el estado general del sistema, ya que varias apps pueden compartir la misma fuente a través de un proveedor. Esto permite que los usuarios ahorren datos móviles, memoria del teléfono y espacio en disco. En este modelo, la fuente se obtiene mediante la red cuando es necesario.

Consulta los siguientes recursos relacionados:

  • App de ejemplo de Fuentes para descargar Java | Kotlin

¿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 Figura 1, se ilustra el proceso.

Componentes principales del proceso de EmojiCompat
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:

Cómo usar la función Fuentes para descargar mediante 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 con la función Fuentes para descargar, puedes usar el proveedor de fuentes de los Servicios de Google Play.

Nota: Para usar el proveedor de Google Fonts, un dispositivo debe tener la versión 11 o una posterior de Servicios de Google Play.

  1. En Layout Editor, selecciona un objeto TextView y, luego, en Properties, selecciona fontFamily > More Fonts.
    Editor de diseño
    Figura 2: Uso del editor de diseño

    Aparece la ventana Resources.

  2. En la lista desplegable Source, selecciona Google Fonts.
  3. En el cuadro Fonts, selecciona una fuente.
  4. Selecciona Create downloadable font y haz clic en OK.

    Nota: Para empaquetar la fuente en tu app, selecciona Add font to project.

    Editor de diseño
    Figura 3: Selección de fuente desde la ventana Resources
  5. Android Studio genera automáticamente los archivos en formato XML relevantes que se necesitan para procesar la fuente en tu app de forma correcta.

    Editor de diseño
    Figura 4: Vista previa del archivo de fuente

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

Antes de Android 8.0 (nivel de API 26), la biblioteca de compatibilidad 26.0 ofrece total compatibilidad para la función Fuentes para descargar. Si deseas obtener más información sobre el uso de la biblioteca de compatibilidad, ve a la sección Fuentes para descargar.

A fin de usar Fuentes para descargar de manera programática, debes interactuar con dos clases clave:

  • android.graphics.fonts.FontRequest: Esta clase te permite crear una solicitud de fuente.
  • FontsContract: Esta clase te permite crear un nuevo objeto Typeface basado en la solicitud de fuente.

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 búsqueda que admite. Para obtener más información sobre las versiones de Android y el formato de búsqueda, 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:
    • 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 búsqueda, revisa 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

      Nota: No es necesario agregar un certificado si solicitas fuentes de proveedores preinstalados. Sin embargo, siempre debes proporcionar un certificado si solicitas fuentes a través de la biblioteca de compatibilidad.

    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 del parámetro de tu proveedor de fuentes. Android Studio propaga automáticamente estos valores para los proveedores que admite en su IU.

  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 una 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 error code constants.
  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 memoria caché. Si la fuente no está disponible de forma local, 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
    • Nota: Asegúrate de que este controlador no sea el controlador de subprocesos de la interfaz de usuario.

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 de Fuentes para descargar Java | Kotlin.

Cómo usar la función Fuentes para descargar mediante la biblioteca de compatibilidad

La biblioteca de compatibilidad 26 admite la función Fuentes para descargar en dispositivos que ejecutan la versión 14 o una posterior de la API de Android. El paquete android.support.v4.provider contiene las clases FontsContractCompat y FontRequest para implementar la retrocompatibilidad de la función Fuentes para descargar. Las clases de la biblioteca de compatibilidad contienen métodos similares al framework. El proceso para descargar fuentes también es similar al que se menciona en la sección Cómo descargar fuentes.

Para descargar fuentes con la biblioteca de compatibilidad, importa las clases FontsContractCompat y FontRequest del paquete android.support.v4.provider. Crea las instancias de estas clases en lugar de las clases del framework FontsContract y android.graphics.fonts.FontRequest.

Nota: Debes proporcionar un certificado cuando solicites fuentes a través de la biblioteca de compatibilidad. Esto se aplica incluso a los proveedores de fuentes preinstalados.

Cómo agregar la dependencia de biblioteca de compatibilidad

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

Para agregar una biblioteca de compatibilidad al proyecto de tu aplicación, haz lo siguiente:

  1. Abre el archivo build.gradle de tu aplicación.
  2. Agrega la biblioteca de compatibilidad a la sección dependencies.

Groovy

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

Kotlin

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

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

Android 8.0 (nivel de API 26) y la biblioteca de compatibilidad 26 ofrecen una manera más rápida y conveniente de declarar una fuente personalizada como un recurso en el diseño XML. De esta manera, no es necesario empaquetar las fuentes como un elemento. Puedes definir una fuente personalizada para todo tu tema, lo que acelera la usabilidad para varios pesos 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 el 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. Por ejemplo, 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 para 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 se deben 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 obtención y usa la fuente predeterminada.

Para declarar previamente las fuentes en el manifiesto, sigue estos pasos:

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

Cómo agregar certificados

Cuando un proveedor de fuentes no está preinstalado o si estás usando la biblioteca de compatibilidad, debes declarar los certificados con los que está firmado el proveedor de fuentes. El sistema usa los certificados para verificar la identidad del proveedor de fuentes.

Nota: Android Studio puede propagar automáticamente los valores para el proveedor de servicios de Google Play si usas la herramienta de selección de fuentes en Android Studio. A fin de obtener más información sobre el uso de Android Studio para descargar fuentes, ve a la sección Cómo usar la función Fuentes para descargar mediante Android Studio y Servicios de Google Play.

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. Configura el atributo fontProviderCerts para el arreglo.
  4. android:fontProviderCerts="@array/certs"
    

    Nota: Si el proveedor tiene más de un conjunto de certificados, puedes definir un arreglo de array de strings.