Usar fontes para download

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

O recurso "Fontes para download" permite que as APIs solicitem fontes de um aplicativo de provedor em vez de agrupar arquivos ou permitir que o app faça o download de fontes. O recurso "Fontes para download" está disponível em dispositivos com a versão 14 ou mais recente da API do Android pela biblioteca AndroidX Core.

O recurso "Fontes para download" oferece 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 por um provedor. Isso faz os usuários economizarem os dados móveis, a memória do smartphone e o espaço em disco. Nesse modelo, a fonte é buscada na rede quando necessário.
Para ter experiência prática com o "Fontes para download", consulte o app de exemplo DownloadableFonts (em inglês).

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.

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

Noções básicas

Você pode usar o recurso "Fontes para download" das maneiras a seguir, discutidas em detalhes em seções posteriores:

Usar o "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 o recurso "Fontes para download", use o provedor de fontes do Google Play Services.

  1. No Layout Editor, selecione um TextView. Em seguida, em Attributes, selecione fontFamily > More Fonts.
    Uma imagem mostrando o Layout Editor do Android Studio
    Figura 2. Uso do Layout Editor.
    A janela Resources será exibida.
  2. No menu Source, selecione Google Fonts.
  3. Na caixa Fontes, selecione uma fonte na área "Para download".
  4. Selecione Criar fonte para download e clique em OK.
    Imagem mostrando como selecionar fontes na janela "Recursos"
    Figura 3. Seleção de uma fonte na janela Resources.
  5. O Android Studio gera automaticamente os arquivos XML relevantes necessários para renderizar a fonte corretamente no app.

    Imagem mostrando como visualizar fontes
    Figura 4. Visualizando o arquivo de fontes.

Usar o "Fontes para download" de forma programática

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

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

O app extrai fontes do provedor de fontes usando a API FontsContract. Cada provedor tem o próprio conjunto de restrições para as versões do Android e a linguagem de consulta compatíveis. Para mais informações sobre as versões do Android e o formato de consulta, confira 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. Forneça 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 saber mais sobre códigos de erro, consulte as constantes de código de erro.
  5. Chame o método FontsContract.requestFont() para extrair a fonte do provedor da fonte. O método inicia uma verificação para determinar se a fonte existe no cache. Se a fonte não estiver disponível localmente, ela vai chamar o provedor de fontes, recuperar a fonte de maneira 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 do "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, consulte o app de exemplo DownloadableFonts (em inglês).

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 as classes FontsContractCompat e FontRequest para implementar o suporte ao recurso "Fontes para download" compatível com versões anteriores. As classes do AndroidX contêm métodos semelhantes aos métodos do framework, e o processo de download de fontes é semelhante ao descrito na seção desta página sobre como usar o "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 de classes de framework FontsContract e android.graphics.fonts.FontRequest.

Adicionar 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 aplicativo, adicione a dependência abaixo 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 o "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 empacotar a fonte como um recurso. Você pode definir uma fonte personalizada para todo o tema, o que acelera a usabilidade de vários pesos e estilos, como negrito, médio ou claro, 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 exemplo de arquivo XML a seguir:
  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. Faça referência ao arquivo como @font/font_file_name no arquivo XML de layout. Você também pode usar o método getFont() para recuperar o arquivo de forma programática, como getFont(R.font.font_file_name).

Pré-declarar fontes 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 ao provedor de fontes e, portanto, aumenta o tempo do primeiro layout. Para evitar atrasos, é possível 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 cancelará o processo de busca e usará a fonte padrão.

Para declarar previamente as fontes no manifesto, siga estas etapas:

  1. Crie uma matriz de recursos em res/values/arrays.xml e declare as fontes que você quer pré-buscar.
  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 tem assinatura. 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 os 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

No Compose 1.2-alpha07, é possível usar a API Downloadable Fonts no app Compose para fazer o download do Google Fonts de forma assíncrona e usá-lo no app. Para saber mais, consulte a documentação Fontes para download do Compose.