Fontes para download

O Android 8.0 (API de nível 26) e a Biblioteca de Suporte do Android 26 introduzem a compatibilidade com APIs para solicitar fontes de um aplicativo provedor, em vez de agrupar arquivos no APK ou permitir que o APK faça o download de fontes. O recurso está disponível em dispositivos com a versão 14 ou mais recente da API do Android na Biblioteca de Suporte 26.

O recurso "Fontes para download" oferece os seguintes benefícios:

  • Reduz o tamanho do app
  • Aumenta a taxa de sucesso da instalação do app
  • Melhora a integridade geral do sistema, já que vários APKs podem compartilhar a mesma fonte usando 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.

Confira os seguintes recursos relacionados:

  • App de exemplo de fontes para download Java | Kotlin

Como funciona o "Fontes para download"?

Um provedor de fontes é um aplicativo que recupera fontes e as armazena em cache de forma local, para que outros apps possam solicitar e compartilhar fontes. A Figura 1 ilustra o processo.

Principais componentes do 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 seguintes maneiras:

Usar o "Fontes para download" por meio do Android Studio e do 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.

Observação: o dispositivo precisa ter a versão 11 ou mais recente do Google Play Services para usar o Google Fonts.

  1. No Layout Editor, selecione uma TextView, e, em Properties, selecione fontFamily > More Fonts.
    Layout Editor
    Figura 2. Como usar o Layout Editor.

    A janela Resources será exibida.

  2. Na lista suspensa Source, selecione Google Fonts.
  3. Na caixa Fonts, selecione uma fonte.
  4. Selecione Create downloadable font e clique em OK.

    Observação: para agrupar a fonte no pacote do app, selecione Add font to project.

    Layout Editor
    Figura 3. Como selecionar uma fonte na janela "Resources".
  5. O Android Studio gera automaticamente os arquivos XML relevantes que são necessários para renderizar a fonte corretamente no app.

    Layout Editor
    Figura 4. Como visualizar o arquivo de fonte.

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

Antes do Android 8.0 (API de nível 26), a Biblioteca de Suporte 26.0 oferece total compatibilidade com o "Fontes para download". Para ver mais informações sobre como usar a Biblioteca de Suporte, vá para a seção "Fontes para download" da Biblioteca de Suporte.

Para usar o recurso "Fontes para download" de forma programática, é necessário interagir com duas classes principais:

  • android.graphics.fonts.FontRequest: essa classe permite criar uma solicitação de fonte.
  • FontsContract: essa classe permite criar um novo objeto Typeface com base na solicitação de fonte.

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 ver mais informações sobre as versões do Android e o formato de consulta, leia 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 do provedor de fontes para confirmar a identidade do provedor.
    • A consulta de string da fonte. Para ver mais informações sobre formatos de consulta, leia 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.

      Observação: não é necessário adicionar um certificado se você solicitar fontes de provedores pré-instalados. No entanto, sempre forneça um certificado se solicitar fontes por meio da Biblioteca de Suporte.

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

    Observação: você pode receber os valores de parâmetro do seu provedor de fontes. O Android Studio preenche automaticamente esses valores para os provedores compatíveis na IU.

  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 um TextView.
  4. Modifique o método onTypefaceRequestFailed() para receber informações sobre erros no processo de solicitação de fonte. Para ver mais informações sobre códigos de erro, consulte error code constants.
  5. Chame o método FontsContract.requestFont() para recuperar a fonte do provedor da fontes. 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 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
    • Observação: esse gerenciador não pode ser o da linha de execução da interface do usuário.

A amostra 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 ver mais informações sobre como fazer o download de uma fonte de um provedor de fontes, consulte o app de amostra Fontes para download Java | Kotlin .

Usar o "Fontes para download" pela Biblioteca de Suporte

A Biblioteca de Suporte 26 oferece compatibilidade com o recurso "Fontes para download" em dispositivos com a versão 14 ou mais recente da API do Android. O pacote android.support.v4.provider contém classes FontsContractCompat e FontRequest para implementar a compatibilidade com versões anteriores para o recurso "Fontes para download". As classes da Biblioteca de Suporte contêm métodos semelhantes ao framework. O processo de download de fontes também é semelhante ao processo mencionado na seção Download de fontes.

Para fazer o download de fontes usando a Biblioteca de Suporte, importe as classes FontsContractCompat e FontRequest do pacote android.support.v4.provider. Crie as instâncias dessas classes em vez das classes FontsContract e android.graphics.fonts.FontRequest de framework.

Observação: você precisa fornecer um certificado quando solicitar fontes por meio da Biblioteca de Suporte. Isso se aplica até mesmo para os provedores de fonte pré-instalados.

Adicionar dependência da Biblioteca de Suporte

Para usar as classes FontsContractCompat e FontRequest, você precisa modificar as dependências do caminho de classe do projeto de app no ambiente de desenvolvimento.

Para adicionar uma Biblioteca de Suporte ao projeto do app:

  1. Abra o arquivo build.gradle do aplicativo.
  2. Adicione a Biblioteca de Suporte à seção dependencies.

Groovy

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

Kotlin

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

Usar o "Fontes para download" como recursos em XML

O Android 8.0 (API de nível 26) e a Biblioteca de Suporte 26 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 ativo. 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 na amostra 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. Referencie o arquivo como @font/nome_do_arquivo_da_fonte no arquivo XML de layout. Você também pode usar o método getFont() para recuperar o arquivo de forma programática. Por exemplo, 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, é possível declarar as fontes que precisam ser recuperadas antecipadamente no manifesto. Depois que o sistema recupera a fonte do provedor, ela fica disponível imediatamente. Se a recuperação da fonte demorar mais que o esperado, o sistema cancelará o processo de busca e usará a fonte padrão.

Para declarar fontes antecipadamente no manifesto, siga as seguintes etapas:

  1. Crie uma matriz de recursos em res/values/arrays.xml e declare o "Fontes para download" 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 caso você esteja usando a Biblioteca de Suporte, será necessário declarar os certificados com os quais o provedor de fontes está conectado. O sistema usa os certificados para confirmar a identidade do provedor da fontes.

Observação: o Android Studio pode preencher automaticamente os valores do provedor do Google Play Services se você usar a ferramenta seletora de fontes no Android Studio. Para ver mais informações sobre o uso do Android Studio para o download de fontes, vá para a seção Usar o "Fontes para download" no Android Studio e no Google Play Services.

Siga as seguintes etapas para adicionar certificados:

  1. Crie uma matriz de strings com os detalhes do certificado. Para ver 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"
    

    Observação: caso o provedor tenha mais de um conjunto de certificados, será possível definir uma matriz de strings.