Usar fontes para download

Testar o Compose
O Jetpack Compose é o kit de ferramentas de interface recomendado para Android. Aprenda a usar texto no Compose.

O recurso permite que as APIs solicitem fontes de um aplicativo provedor, em vez de agrupar arquivos no app ou permitir que ele faça o download de fontes. As fontes para download estão disponíveis em dispositivos com a versão 14 ou mais recente da API do Android na biblioteca AndroidX Core.

As fontes para download oferecem os seguintes benefícios:

  • Reduz o tamanho do app, aumentando a taxa de sucesso da instalação.
  • Melhora a integridade geral do sistema, já que vários apps podem compartilhar a mesma fonte usando um provedor. Isso faz com que os usuários economizem dados móveis, memória do smartphone e espaço em disco. Nesse modelo, a fonte é buscada na rede quando necessário.
Para ter uma experiência prática com o "Fontes para download", consulte o app de exemplo DownloadableFonts.

Como funcionam as Fontes para download?

Um provedor de fontes é um aplicativo que recupera fontes e as armazena em cache localmente para que outros apps possam solicitar e compartilhar fontes. A figura a seguir ilustra o processo.

Uma imagem mostrando os principais componentes no processo de compatibilidade de emojis
Figura 1. Processo de "Fontes para download".

Noções básicas

Você pode usar o recurso "Fontes para download" das seguintes maneiras, que são discutidas em detalhes em seções posteriores:

Usar fontes para download com o Android Studio e o Google Play Services

Você pode configurar seu aplicativo para fazer o download de fontes usando o Android Studio 3.0 ou versões mais recentes. Para ajudar você a começar a usar os recursos de fontes para download, use o provedor de fontes do Google Play Services.

  1. No Layout Editor, selecione uma TextView. Em seguida, em Atributos, selecione fontFamily > Mais fontes.
    Uma imagem mostrando o Layout Editor do Android Studio
    Figura 2. Usando o Layout Editor.
    A janela Resources vai aparecer.
  2. No menu Origem, selecione Google Fonts.
  3. Na caixa Fonts, selecione uma fonte na área "Downloadable".
  4. Selecione Create downloadable font e clique em OK.
    Uma imagem mostrando como selecionar fontes na janela "Resources"
    Figura 3. Como selecionar uma fonte na janela Resources.
  5. O Android Studio gera automaticamente os arquivos XML relevantes necessários para renderizar a fonte corretamente no app.

    Uma imagem mostrando como visualizar fontes
    Figura 4. Visualização do arquivo de fonte.

Usar fontes para download de forma programática

A partir do Android 8.0 (nível 26 da API), o AndroidX Core oferece suporte total a fontes para download. Para mais informações sobre como usar a biblioteca AndroidX Core, consulte a seção "Biblioteca AndroidX Core para fontes para download" nesta página.

Para usar o recurso "Fontes para download" de forma programática, interaja com duas classes principais:

Seu app recupera fontes do provedor de fontes usando a API FontsContract. Cada provedor tem o próprio conjunto de restrições para versões do Android e linguagem de consulta compatíveis. Para mais informações sobre as versões do Android e o formato de consulta, consulte a documentação do seu provedor.

Para fazer o download de uma fonte, siga estas etapas:

  1. Crie uma instância da classe android.graphics.fonts.FontRequest para solicitar a fonte do provedor. Para criar uma solicitação, transmita os seguintes parâmetros:
    • A autoridade do provedor de fontes.
    • O pacote de provedor de fontes para confirmar a identidade do provedor.
    • A consulta de string da fonte. Para saber mais sobre formatos de consulta, consulte a documentação do seu provedor de fontes, como o Google Fonts.
    • Uma lista de conjuntos de hashes para que os certificados confirmem a identidade do provedor.

    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. Crie uma instância da classe FontsContract.FontRequestCallback.
  3. Modifique o método onTypefaceRetrieved() para indicar que a solicitação de fonte foi concluída. Informe a fonte recuperada como parâmetro. Você pode usar esse método para definir a fonte conforme necessário. Por exemplo, você pode definir a fonte em uma TextView.
  4. Modifique o método onTypefaceRequestFailed() para receber informações sobre erros no processo de solicitação de fonte. Para mais informações sobre códigos de erro, consulte as constantes de código de erro.
  5. Chame o método FontsContract.requestFont() para recuperar a fonte do provedor. O método inicia uma verificação para determinar se a fonte existe no cache. Se a fonte não estiver disponível localmente, ele vai chamar o provedor da fontes, recuperar a fonte de forma assíncrona e transmitir o resultado para o callback. Transmita os seguintes parâmetros:
    • Uma instância da classe Context
    • Uma instância da classe android.graphics.fonts.FontRequest
    • Um callback para receber os resultados da solicitação de fonte
    • Um gerenciador para buscar fontes em uma linha de execução

O exemplo de código a seguir ilustra o processo geral das fontes para download:

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 saber mais sobre como fazer o download de uma fonte de um provedor de fontes, consulte o app de exemplo DownloadableFonts.

Usar "Fontes para download" com o AndroidX Core

O AndroidX Core oferece suporte ao recurso "Fontes para download" em dispositivos com a versão 14 ou mais recente da API do Android. O pacote androidx.core.provider contém classes FontsContractCompat e FontRequest para implementar a compatibilidade com versões anteriores para o recurso "Fontes para download". As classes do AndroidX contêm métodos semelhantes aos do framework, e o processo de download de fontes é semelhante ao descrito na seção sobre como usar fontes para download de forma programática.

Para fazer o download de fontes usando o AndroidX, importe as classes FontsContractCompat e FontRequest do pacote androidx.core.provider. Crie instâncias dessas classes em vez das classes FontsContract e android.graphics.fonts.FontRequest do framework.

Adicionar a dependência do AndroidX Core

Para usar as classes FontsContractCompat e FontRequest, é necessário modificar as dependências do caminho de classe do projeto do app no ambiente de desenvolvimento.

Para adicionar o AndroidX Core ao projeto do app, adicione a seguinte dependência ao arquivo build.gradle do app:

Groovy

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

Kotlin

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

Usar fontes para download como recursos em XML

O Android 8.0 (nível 26 da API) e o AndroidX Core oferecem uma maneira mais rápida e conveniente de declarar uma fonte personalizada como um recurso no layout XML. Isso significa que não é necessário agrupar a fonte como um recurso. Você pode definir uma fonte personalizada para o tema inteiro, o que acelera a usabilidade de vários pesos e estilos, como negrito, médio ou leve, quando fornecidos.

  1. Crie um novo arquivo XML na pasta res/font.
  2. Adicione um elemento raiz <font-family> e defina os atributos relacionados à fonte, conforme mostrado no arquivo XML de exemplo abaixo:
  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. Referencie o arquivo como @font/font_file_name no arquivo XML de layout. Também é possível usar o método getFont() para recuperar o arquivo de forma programática, como getFont(R.font.font_file_name).

Declarar fontes antecipadamente no manifesto

A inflação do layout e a recuperação de recursos são tarefas síncronas. Por padrão, a primeira tentativa de recuperar fontes aciona uma solicitação para o provedor de fontes e, portanto, aumenta o tempo do primeiro layout. Para evitar atrasos, você pode declarar previamente as fontes que precisam ser recuperadas no manifesto. Depois que o sistema recupera a fonte do provedor, ela fica disponível imediatamente. Se a recuperação da fonte demorar mais do que o esperado, o sistema aborta o processo de busca e usa a fonte padrão.

Para declarar fontes antecipadamente no manifesto, siga estas etapas:

  1. Crie uma matriz de recursos em res/values/arrays.xml e declare as fontes que você quer buscar antecipadamente.
  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. Use uma tag meta-data para declarar a matriz de recursos no manifesto.
  4. <meta-data android:name="preloaded_fonts" android:resource="@array/preloaded_fonts" />
    

Adicionar certificados

Quando um provedor de fontes não estiver pré-instalado ou se você estiver usando a biblioteca AndroidX Core, declare os certificados com que o provedor de fontes está conectado. O sistema usa os certificados para verificar a identidade do provedor de fontes.

Siga as seguintes etapas para adicionar certificados:

  1. Crie uma matriz de strings com os detalhes do certificado. Para mais informações sobre detalhes do certificado, consulte a documentação do seu provedor de fontes.
  2. <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="certs">
           <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item>
        </string-array>
    </resources>
    
  3. Defina o atributo fontProviderCerts para a matriz.
  4. android:fontProviderCerts="@array/certs"
    

Fontes para download no Compose