> For the complete documentation index, see [llms.txt](https://docs.caf.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.caf.io/caf-sdk/caf-sdk-pt-br/android/installation-guide.md).

# Guia de Instalação

{% hint style="warning" %}
Este guia abrange a versão 7.14.0 e superior. Para versões anteriores à 7.14.0, consulte a [documentação legada](https://docs.caf.io/caf-sdk/android/getting-started-with-the-sdk-1).
{% endhint %}

## Instalando o SDK para Android <a href="#requirements-for-adding" id="requirements-for-adding"></a>

Este guia o conduzirá por todo o processo de configuração necessário para baixar, configurar e instalar com sucesso o SDK em sua máquina

### Requisitos <a href="#requirements-for-adding" id="requirements-for-adding"></a>

Antes de integrar, certifique-se de que seu ambiente atenda aos requisitos mínimos do Certta SDK:

| Requisito                                    | Versão |
| -------------------------------------------- | ------ |
| Versão mínima do SDK (minSdk)                | 26     |
| Versão de compilação do Android (compileSDK) | 36     |
| Versão mínima do Kotlin                      | 1.9.10 |
| Versão do Gradle                             | 8.4    |
| Android Gradle Plugin (AGP)                  | 8.3.2  |

### Permissões

Para habilitar a funcionalidade de rede e câmera necessária para o Certta SDK, você deve declarar as permissões e os recursos de hardware apropriados no `AndroidManifest.xml` arquivo do seu projeto.

Adicione as seguintes linhas dentro do seu `<manifest>` tag:

{% tabs %}
{% tab title="Prova de vida" %}
{% code title="AndroidManifest.xml" expandable="true" %}

```xml
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
```

{% endcode %}
{% endtab %}

{% tab title="Document Detector" %}
{% code title="AndroidManifest.xml" expandable="true" %}

```xml
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
O Detector de Documentos requer `READ_EXTERNAL_STORAGE` permissão quando o envio de documentos estiver ativado.
{% endhint %}

### Adicionando repositórios

Para baixar o Certta SDK, você deve informar ao seu projeto Android onde encontrar suas dependências. Isso é feito configurando o `dependencyResolutionManagement` bloco localizado na raiz do seu projeto `settings.gradle.kts` arquivo do seu projeto.

Adicione os URLs de repositório necessários à sua configuração:

{% hint style="info" %}
Para projetos baseados em Groovy, inclua os seguintes repositórios no `settings.gradle` arquivo do seu projeto.
{% endhint %}

{% tabs %}
{% tab title="Script Kotlin" %}
{% code title="settings.gradle.kts" expandable="true" %}

```kts
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url = uri("https://repo.combateafraude.com/android/release") }        
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Groovy" %}
{% code title="settings.gradle" expandable="true" %}

```groovy
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url "https://repo.combateafraude.com/android/release" }
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Adicionando dependências

Para integrar o Certta SDK ao seu app, adicione as dependências necessárias ao nível do módulo (nível do app) `build.gradle.kts` arquivo do seu projeto.

Coloque a seguinte linha dentro do seu `dependencies` bloco:

{% tabs %}
{% tab title="Script Kotlin" %}
{% code title="build.gradle.kts" expandable="true" %}

```kts
dependencies {
    // Gerencia as versões de todas as dependências
    implementation(platform("io.caf.sdk:caf-sdk-bom:7.19.0"))
    
    // --- Detector de Documentos (Escolha um) ---
    implementation("io.caf.sdk:document-detector-ui") // Adiciona telas de UI personalizáveis
    // implementation("io.caf.sdk:document-detector") // Apenas o núcleo (crie sua própria UI)

    // --- Prova de vida facial (Escolha um) ---
    implementation("io.caf.sdk:caffaceliveness-ui") // Adiciona telas de UI personalizáveis
    // implementation("io.caf.sdk:caffaceliveness") // Apenas o núcleo (crie sua própria UI)

    // --- Provedores de prova de vida ---
    implementation("io.caf.sdk:caffaceliveness-providers-iproov-lite")
    implementation("io.caf.sdk:caffaceliveness-providers-payface")
    implementation("io.caf.sdk:caffaceliveness-providers-facetec")
    
    // --- Impressão digital ---
    implementation("io.caf.sdk:fingerprint")
}
```

{% endcode %}
{% endtab %}

{% tab title="Groovy" %}
{% code title="build.gradle" expandable="true" %}

```groovy
dependencies {
    // Gerencia as versões de todas as dependências
    implementation platform("io.caf.sdk:caf-sdk-bom:7.13.0")
    
    // --- Detector de Documentos (Escolha um) ---
    implementation "io.caf.sdk:document-detector-ui" // Adiciona telas de UI personalizáveis
    // implementation "io.caf.sdk:document-detector" // Apenas o núcleo (crie sua própria UI)

    // --- Prova de vida facial (Escolha um) ---
    implementation "io.caf.sdk:caffaceliveness-ui" // Adiciona telas de UI personalizáveis
    // implementation "io.caf.sdk:caffaceliveness" // Apenas o núcleo (crie sua própria UI)

    // --- Provedores de prova de vida ---
    implementation "io.caf.sdk:caffaceliveness-providers-iproov-lite"
    implementation "io.caf.sdk:caffaceliveness-providers-payface"
    implementation "io.caf.sdk:caffaceliveness-providers-facetec"
    
     // --- Impressão digital ---
    implementation "io.caf.sdk:fingerprint"
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Ao usar o `caffaceliveness` módulo, você deve incluir pelo menos uma dependência de provedor de prova de vida (como `iproov-lite`, `payface`, ou `facetec`) em seu `build.gradle` arquivo do seu projeto.
{% endhint %}

## Configuração e personalizações

#### Obtendo o token móvel

Para gerar seu token móvel, siga este guia:

{% content-ref url="/pages/350b53d9674174220c34ca357260b91ef975ad64" %}
[Autenticação](/caf-sdk/caf-sdk-pt-br/authentication.md)
{% endcontent-ref %}

### Configurando a sessão

Depois de obter seu token móvel, inicialize o Certta SDK dentro da sua custom `Application` classe. Isso deve ser feito dentro do `onCreate()` método usando o contexto da aplicação e seu objeto de configuração.

Aqui está um exemplo de como sua `Application` classe pode ficar:

{% hint style="info" %}
Tanto o `userId` e `mobileToken` são opcionais durante a configuração inicial. Além disso, esses valores não são permanentes; você pode atualizá-los ou alterá-los a qualquer momento durante o ciclo de vida da aplicação, conforme suas necessidades evoluírem.
{% endhint %}

{% tabs %}
{% tab title="Kotlin" %}
{% code title="MyApplication.kt" overflow="wrap" expandable="true" %}

```kt
val config = CerttaConfiguration(
    userId = "user-id",
    mobileToken = "your-jwt",
    environment = CerttaEnvironment.PROD,
    securityEnabled = true,
)

Certta.instance.configure(
    context = this,
    config = config
) 
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code title="MyApplication.java" overflow="wrap" expandable="true" %}

```java
CerttaConfiguration config = new CerttaConfiguration(
   "your-jwt",     // token móvel
   "user-id",      // ID do usuário
   CerttaEnvironment.PROD, // ambiente
   true,            // segurança habilitada
);

Certta.getInstance().configure(this, config);
```

{% endcode %}
{% endtab %}
{% endtabs %}

#### Parâmetros de CerttaConfiguration

<table><thead><tr><th width="214.10546875">Parâmetro</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td><code>mobileToken</code></td><td><code>String</code></td><td>Seu Token Web JSON (JWT) gerado.</td></tr><tr><td><code>userId</code></td><td><code>String</code></td><td>Um identificador exclusivo para o usuário.</td></tr><tr><td><code>securityEnabled</code></td><td><code>Booleano</code></td><td>Ativa ou desativa as validações de segurança.</td></tr><tr><td><code>environment</code></td><td><code>CerttaEnvironment</code></td><td>Define o ambiente de execução.</td></tr></tbody></table>

#### Atualizações de configuração em tempo de execução

O `userId` e `mobileToken` não ficam restritas à configuração inicial; elas podem ser atualizadas dinamicamente em tempo de execução para acomodar mudanças nas sessões dos usuários ou nos requisitos de segurança.

{% hint style="success" %}
Esses métodos podem ser chamados de qualquer Activity ou Fragment após a configuração inicial ter sido estabelecida na sua `Application` classe.
{% endhint %}

Para atualizar esses valores, use os métodos específicos fornecidos pela `Certta` instância:

{% tabs %}
{% tab title="Kotlin" %}
{% code title="MyActivity.kt" %}

```kotlin
Certta.instance.updateUserId("new-user-id")
Certta.instance.updateMobileToken("new-jwt-token")
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code title="MyActivity.java" overflow="wrap" expandable="true" %}

```java
Certta.getInstance().updateUserId("new-user-id");
Certta.getInstance().updateMobileToken("new-jwt-token");
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Use esses métodos sempre que seu app realizar logout/login ou quando seu backend emitir um JWT atualizado para garantir que o Certta SDK permaneça sincronizado com sua sessão ativa.
{% endhint %}

## Tematização de cores

Tanto os módulos de prova de vida quanto de Detector de Documentos suportam tematização personalizada de cores, permitindo que você combine perfeitamente a interface do SDK com as diretrizes de marca do seu aplicativo. Você pode personalizar a UI fornecendo valores de cor em um formato padrão de string hexadecimal (por exemplo, `"#RRGGBB"`).

Após configurar o SDK, crie um `CerttaColorConfiguration` objeto com as cores que você deseja alterar e passe-o para `Certta.instance.setColorConfiguration()`.

{% tabs %}
{% tab title="Kotlin" %}
{% code expandable="true" %}

```kotlin
val colorConfig = CerttaColorConfiguration(
    primaryColor = "#FF0000",
    secondaryColor = "#00FF00",
    backgroundColor = "#FFFFFF",
    contentColor = "#000000",
    mediumColor = "#D1D1D1",
    dialogBackgroundColor = "#FFFFFF",
    dialogBorderColor = "#0C395E",
)
Certta.instance.setColorConfiguration(colorConfig)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code expandable="true" %}

```java
CafColorConfiguration colorConfig = new CafColorConfiguration(
      "#FF0000", // primaryColor
      "#00FF00", // secondaryColor
      "#FFFFFF", // backgroundColor
      "#000000", // contentColor
      "#D1D1D1", // mediumColor,
      "#FFFFFF", // dialogBackgroundColor
      "#0C395E" // dialogBorderColor
);
Certta.getInstance().setColorConfiguration(colorConfig);
```

{% endcode %}
{% endtab %}
{% endtabs %}

#### Parâmetros de ColorConfiguration

{% hint style="info" %}
Todos os parâmetros do objeto de configuração são opcionais. Você só precisa definir as cores específicas que deseja sobrescrever para o seu tema personalizado.
{% endhint %}

| Propriedade de cor      | Descrição                                           |
| ----------------------- | --------------------------------------------------- |
| `primaryColor`          | Cor principal para botões e destaques.              |
| `secondaryColor`        | Cor secundária para elementos complementares.       |
| `backgroundColor`       | Cor de fundo da tela.                               |
| `contentColor`          | Cor usada para textos e ícones.                     |
| `mediumColor`           | Cor neutra para elementos como barras de progresso. |
| `dialogBackgroundColor` | Cor de fundo de diálogos e pop-ups.                 |
| `dialogBorderColor`     | Cor da borda de diálogos e pop-ups.                 |

## Ofuscação de código

Confira o bloco de código com as regras do ProGuard/R8 necessárias para que o SDK e suas dependências funcionem corretamente mesmo após a ofuscação e a otimização do código. Essas regras preservam informações essenciais (como assinaturas, anotações e classes internas) e impedem que classes críticas sejam removidas ou alteradas.

{% code title="proguard\_rules.txt" expandable="true" %}

```
# O pré-handler Android para exceções é carregado de forma reflexiva (via ServiceLoader).
-keep class kotlinx.coroutines.experimental.android.AndroidExceptionPreHandler { *; }

### GSON ##################################################################
# O Gson usa informações genéricas de tipo armazenadas em um arquivo de classe ao trabalhar com campos.
# O ProGuard remove essas informações por padrão, então configure-o para manter todas elas.
-keepattributes Signature
# Para usar a anotação @Expose do GSON
-keepattributes *Annotation*
### FIM GSON ##################################################################

### Retrofit ##################################################################
# Preserva assinaturas genéricas, classes internas e métodos envolventes para a reflexão do Retrofit.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Mantém anotações visíveis em tempo de execução em métodos e parâmetros.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
# Mantém os valores padrão das anotações.
-keepattributes AnnotationDefault
# Mantém os parâmetros dos métodos de serviço para interfaces com anotações do Retrofit.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}
# Suprime avisos para ferramentas de build e certas anotações JSR 305.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn javax.annotation.**
-dontwarn kotlin.Unit
-dontwarn retrofit2.KotlinExtensions
-dontwarn retrofit2.KotlinExtensions$*
# Mantém explicitamente as interfaces do Retrofit para evitar a nulificação pelo R8.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface <1>
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface * extends <1>
# Preserva as continuations usadas por funções suspend do Kotlin.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation
# Para o modo completo do R8: mantém os tipos genéricos de retorno para métodos do Retrofit.
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>
# Preserva a classe Response do Retrofit.
-keep,allowobfuscation,allowshrinking class retrofit2.Response
### FIM Retrofit ##############################################################

### OkHttp ####################################################################
# Suprime avisos para anotações JSR 305.
-dontwarn javax.annotation.**
# Adapta os nomes de arquivos de recursos para o banco de dados interno de sufixos públicos.
-adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz
# Suprime avisos para o Animal Sniffer e classes específicas da plataforma.
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.**
-dontwarn org.conscrypt.**
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**
# Mantém todas as classes do OkHttp e do Okio.
-keep class okhttp3.** { *; }
-dontwarn okhttp3.**
-keep class okio.** { *; }
-dontwarn okio.**
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
### FIM OkHttp ################################################################

### Serialização Kotlin ######################################################
# Mantém os objetos Companion para classes serializáveis.
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
    static <1>$Companion Companion;
}
# Mantém funções serializer nos objetos companion.
-if @kotlinx.serialization.Serializable class ** {
    static **$* *;
}
-keepclassmembers class <2>$<3> {
    kotlinx.serialization.KSerializer serializer(...);
}
# Mantém INSTANCE e serializer para objetos serializáveis.
-if @kotlinx.serialization.Serializable class ** {
    public static ** INSTANCE;
}
-keepclassmembers class <1> {
    public static <1> INSTANCE;
    kotlinx.serialization.KSerializer serializer(...);
}
# Preserva objetos Companion em kotlinx.serialization.json.
-keepclassmembers class kotlinx.serialization.json.** {
    *** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
    kotlinx.serialization.KSerializer serializer(...);
}
# Preserva a busca do serializer para classes serializáveis (ajuste o nome do pacote conforme necessário).
-keepclassmembers @kotlinx.serialization.Serializable class packeage.** {
    *** Companion;
    *** INSTANCE;
    kotlinx.serialization.KSerializer serializer(...);
}
### FIM Serialização Kotlin #################################################

### AutoValue ################################################################
-dontwarn com.google.auto.**
-dontwarn autovalue.shaded.com.**
-dontwarn sun.misc.Unsafe
-dontwarn javax.lang.model.element.Modifier
### FIM AutoValue ############################################################

### CAF - Combate à Fraude ######################################################
# Mantém atributos de exceções.
-keepattributes Exceptions
# Preserva todas as classes, interfaces e membros de classe para os módulos CAF.
-keep class com.caf.facelivenessiproov.** { *; }
-keep class com.combateafraude.documentdetector.** { *; }
-keep class com.combateafraude.** { *; }
-keep interface com.combateafraude.** { *; }
-keep class io.caf.** { *; }
-keep interface io.caf.** { *; }
-keepclassmembers class com.combateafraude.** { *; }
# Suprime avisos para java.nio.file e certas classes internas do OkHttp.
-dontwarn java.nio.file.*
-dontwarn com.squareup.okhttp.internal.Platform
# Mantém campos em classes que estendem GeneratedMessageLite (para uso com Tink).
-keepclassmembers class * extends com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite {
  <fields>;
}
# Preserva classes do TensorFlow.
-keep class org.tensorflow.** { *; }
-keep class org.tensorflow.**$* { *; }
-dontwarn org.tensorflow.**
# Preserva classes do IProov e classes do Protobuf.
-keep public class com.iproov.sdk.IProov { public *; }
-keep class com.iproov.** { *; }
-keep class com.iproov.**$* { *; }
-keep class com.google.protobuf.** { *; }
-keep class com.google.protobuf.**$* { *; }
-dontwarn com.google.protobuf.**
# Suprime avisos para classes Flow concorrentes.
-dontwarn java.util.concurrent.Flow*
# Preserva classes Kotlin e kotlinx.
-keep class kotlin.** { *; }
-keep class kotlinx.** { *; }
-dontwarn com.android.tools.lint.**
-dontwarn io.caf.sdk.common.jvmshared.lint.**
### FIM CAF - Combate à Fraude ##################################################
```

{% endcode %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.caf.io/caf-sdk/caf-sdk-pt-br/android/installation-guide.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
