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.
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.
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:
- Como usar o Android Studio e o Google Play Services
- De forma programática
- Como usar a biblioteca AndroidX Core
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.
- No Layout Editor, selecione uma
TextView
. Em seguida, em Atributos, selecione fontFamily > Mais fontes. A janela Resources vai aparecer. - No menu Origem, selecione Google Fonts.
- Na caixa Fonts, selecione uma fonte na área "Downloadable".
- Selecione Create downloadable font e clique em OK.
O Android Studio gera automaticamente os arquivos XML relevantes necessários para renderizar a fonte corretamente no app.
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:
android.graphics.fonts.FontRequest
: essa classe permite criar uma solicitação de fonte.FontsContractCompat
: essa classe permite criar um novo objetoTypeface
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
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:
- 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);
- Crie uma instância da classe
FontsContract.FontRequestCallback
. - 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 umaTextView
. - 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. - 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
- Uma instância da classe
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.
- Crie um novo arquivo XML na pasta
res/font
. - Adicione um elemento raiz
<font-family>
e defina os atributos relacionados à fonte, conforme mostrado no arquivo XML de exemplo abaixo: - Referencie o arquivo como
@font/font_file_name
no arquivo XML de layout. Também é possível usar o métodogetFont()
para recuperar o arquivo de forma programática, comogetFont(R.font.font_file_name)
.
<?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>
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:
- Crie uma matriz de recursos em
res/values/arrays.xml
e declare as fontes que você quer buscar antecipadamente. - Use uma tag
meta-data
para declarar a matriz de recursos no manifesto.
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>
<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:
- 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.
- Defina o atributo
fontProviderCerts
para a matriz.
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="certs"> <item>MIIEqDCCA5CgAwIBAgIJA071MA0GCSqGSIb3DQEBBAUAMIGUMQsww...</item> </string-array> </resources>
android:fontProviderCerts="@array/certs"