> 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/flutter/standalone-modules/deprecated-sdks/document-detector/v7-and-above.md).

# DocumentDetector v7.x e acima

## Requisitos

| Flutter | Versão            |
| ------- | ----------------- |
| Flutter | 1.20+             |
| Dart    | `>=2.15.0 <4.0.0` |

| Android    | Versão |
| ---------- | ------ |
| minSdk     | 26     |
| compileSdk | 34     |

| iOS         | Versão |
| ----------- | ------ |
| Alvo do iOS | 13.0+  |
| Xcode       | 15.4+  |
| Swift       | 5.3.2+ |

## Dependências dos SDKs nativos

{% tabs %}
{% tab title="Android" %}

```groovy

dependencies {
    // Básico
    implementation "androidx.appcompat:appcompat:1.1.0"

    // Design
    implementation "com.google.android.material:material:1.2.1"
    implementation "androidx.constraintlayout:constraintlayout:2.0.1"

    // Detecção de documentos
    implementation "org.tensorflow:tensorflow-lite:2.11.0"
    implementation "org.tensorflow:tensorflow-lite-support:0.4.3"

    // SecurityProvider
    implementation "com.google.android.gms:play-services-basement:18.3.0"

    // HTTP e desserializador
    implementation "com.squareup.retrofit2:retrofit:2.9.0"
    implementation "com.squareup.retrofit2:converter-gson:2.9.0"
    implementation "com.squareup.okhttp3:okhttp:4.9.3"
    implementation "com.squareup.okhttp3:okhttp-tls:4.9.3"

    //exifInterface
    implementation "androidx.exifinterface:exifinterface:1.0.0"

    // Biblioteca principal CameraX usando a implementação camera2
    // A linha a seguir é opcional, pois a biblioteca principal é incluída indiretamente por camera-camera2
    implementation "androidx.camera:camera-core:1.1.0"
    implementation "androidx.camera:camera-camera2:1.1.0"
    // Se você quiser usar adicionalmente a biblioteca CameraX Lifecycle
    implementation "androidx.camera:camera-lifecycle:1.1.0"
    // Se você quiser usar adicionalmente a classe View do CameraX
    implementation "androidx.camera:camera-view:1.1.0"

    // Verificações de root
    implementation "com.scottyab:rootbeer-lib:0.0.8"

    // Commons Imaging (para imagens, dados EXIF e assim por diante. anteriormente conhecido como Apache Commons Sanselan)
    implementation "org.apache.commons:commons-imaging:1.0-alpha3"

    // Kotlin
    implementation "androidx.core:core-ktx:1.7.0"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.5.31"
}

```

{% endtab %}

{% tab title="iOS" %}

```ruby

pod "TensorFlowLiteSwift", "2.14.0"

```

{% endtab %}
{% endtabs %}

## Permissões em tempo de execução

{% tabs %}
{% tab title="Android" %}
Estas são as permissões de tempo de execução do Android:

| Permissão               | Motivo                                                                                                                                                               | Obrigatório                                       |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| `CÂMERA`                | Para capturar fotos dos documentos                                                                                                                                   | Necessário apenas no fluxo de captura pela câmera |
| `READ_EXTERNAL_STORAGE` | Para acessar o armazenamento externo do dispositivo e selecionar documentos no fluxo de upload. *Esta permissão é necessária apenas para versões inferiores à API33* | Necessário apenas no fluxo de envio               |
| {% endtab %}            |                                                                                                                                                                      |                                                   |

{% tab title="iOS" %}
Estas são as permissões de tempo de execução do iOS:

| Permissão                                               | Motivo                                  | Obrigatório                                       |
| ------------------------------------------------------- | --------------------------------------- | ------------------------------------------------- |
| `Privacidade - Descrição de Uso da Câmera`              | Para capturar a(s) foto(s) do documento | Necessário apenas no fluxo de captura pela câmera |
| `Privacidade - Descrição de Uso da Biblioteca de Fotos` | Para realizar a abertura da galeria     | Necessário apenas no fluxo de envio               |
| {% endtab %}                                            |                                         |                                                   |
| {% endtabs %}                                           |                                         |                                                   |

## Configurações da plataforma

{% tabs %}
{% tab title="Android" %}
Se a sua versão do Gradle for anterior à 7, adicione estas linhas ao seu `build.gradle`.

```groovy
allprojects {
  repositories {
  ...
  maven { url 'https://repo.combateafraude.com/android/release' }
  maven { url 'https://jitpack.io' }

}}
```

Se a sua versão do Gradle for 7 ou mais recente, adicione estas linhas ao seu `settings.gradle`.

```groovy
dependencyResolutionManagement {
    repositories {
        ...
        maven { url 'https://repo.combateafraude.com/android/release' }
        maven { url 'https://jitpack.io' }
    }
}
```

Adicione suporte ao Java 8 (ignore este código se o Java 8 estiver habilitado) e ao TensorFlow Model ao seu `build.gradle` arquivo.

```groovy
android {

    ...

    aaptOptions {
        noCompress "tflite"
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}
```

{% hint style="info" %}
O `compileOptions` a configuração é necessária para as funções lambda internas do SDK, que foram lançadas no Java 8. A `noCompress` configuração diz ao compilador para não compactar arquivos com a `.tflite` extensão usada no DocumentDetector.
{% endhint %}

Para personalizar a cor principal do SDK, você precisa garantir que a biblioteca Material Design esteja importada no seu app. Adicione a seguinte dependência ao seu arquivo build.gradle:

```groovy
dependencies {
    ...
    implementation 'com.google.android.material:material:1.9.0'
}
```

{% endtab %}

{% tab title="iOS" %}
No **`info.plist`** arquivo, adicione as permissões abaixo:

| Permissão                                               | Motivo                                  | Obrigatório                                       |
| ------------------------------------------------------- | --------------------------------------- | ------------------------------------------------- |
| `Privacidade - Descrição de Uso da Câmera`              | Para capturar a(s) foto(s) do documento | Necessário apenas no fluxo de captura pela câmera |
| `Privacidade - Descrição de Uso da Biblioteca de Fotos` | Para realizar a abertura da galeria     | Necessário apenas no fluxo de envio               |

{% hint style="info" %}
Nosso SDK tem traduções para três idiomas (inglês, português e espanhol). Para garantir que ele funcione corretamente de acordo com o idioma do seu sistema operacional, adicione o seguinte ao Info.plist do seu app (se ainda não tiver feito isso):

```xml
<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>Português (Brasil)</string>
    <string>es</string>
</array>
```

{% endhint %}

{% hint style="info" %}
Observe que o framework gerado para a implementação iOS do nosso SDK é `estático`. Este é um detalhe importante a considerar durante o desenvolvimento.

Motivo: o uso de um framework estático se deve à nossa dependência da `TensorFlowLiteSwift` biblioteca.

Essa abordagem foi escolhida para proporcionar uma melhor experiência de desenvolvimento, garantindo integração suave e desempenho ideal.
{% endhint %}
{% endtab %}
{% endtabs %}

## Documentos suportados

Atualmente, os documentos suportados são:

```dart
enum DocumentType {
    rgFront, // frente do RG (onde está a foto)
    rgBack, // verso do RG
    rgFull, // RG aberto (mostrando frente e verso juntos)
    cnhFront, // frente da CNH (onde está a foto)
    cnhBack, // verso da CNH 
    cnhFull, // CNH aberta (mostrando frente e verso juntos)
    crlv, // CRLV
    rneFront, // frente do RNE ou RNM
    rneBack, // verso do RNE ou RNM
    passport, // passaporte (mostrando a foto e os dados)
    ctpsFront, // frente da CTPS (onde está a foto)
    ctpsBack, // verso da CTPS
    any; // permite enviar qualquer tipo de documento, todos os mencionados acima, incluindo qualquer outro documento
}
```

## Instanciando o SDK

Para criar uma `DocumentDetector` instância, dois **parâmetros obrigatórios** devem ser fornecidos:

| Parâmetro     | Descrição                                                                                                           |
| ------------- | ------------------------------------------------------------------------------------------------------------------- |
| `mobileToken` | Token de uso associado à sua conta CAF                                                                              |
| `captureFlow` | Define o fluxo de captura do documento. Crie uma `List<DocumentCaptureFlow>` para configurar cada etapa de captura. |

### DocumentCaptureFlow

Cada `DocumentCaptureFlow` elemento da lista será uma etapa de captura.

O `DocumentCaptureFlow` a classe tem as seguintes configurações:

#### `DocumentType documentType`

Identifica qual documento será solicitado para captura na respectiva etapa. Você pode escolher na [Documentos suportados](#supported-documents) lista.

***

#### `InstructionalPopupSettingsAndroid? androidCustomization`

Personalize a ilustração e o rótulo do documento no popup instrucional para dispositivos Android.

| Parâmetro                      | Descrição                                                                                                                                                                                                   |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `String? documentLabel`        | Altere o rótulo do documento exibido no popup. Para personalizar isso, basta fornecer um `String` elemento.                                                                                                 |
| `String? documentIllustration` | Altere a ilustração do documento exibida no popup. Para personalizar isso, você deve fornecer o `nome` do arquivo com a ilustração personalizada que você criou na `res/drawable` pasta do seu app Android. |

***

#### `InstructionalPopupSettingsIOS? iOSCustomization`

Personalize a ilustração e o rótulo do documento no popup instrucional para dispositivos iOS.

| Parâmetro                      | Descrição                                                                                                                                                                                            |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `String? documentLabel`        | Altere o rótulo do documento exibido no popup. Para personalizar isso, você só precisa fornecer um `String` elemento.                                                                                |
| `String? documentIllustration` | Altere a ilustração do documento exibida no popup. Para personalizar isso, você deve fornecer o nome do `Image Set` com a ilustração personalizada que você criou no `Asset Catalog` do seu app iOS. |

## Exemplo de implementação

Este é um exemplo de como instanciar o SDK e capturar seus resultados:

```dart
List<DocumentCaptureFlow> cnhFlow = [
    DocumentCaptureFlow(documentType: DocumentType.cnhFront),
    DocumentCaptureFlow(documentType: DocumentType.cnhBack)
];

DocumentDetector documentDetector =
    DocumentDetector(mobileToken: mobileToken, captureFlow: cnhFlow);
    
// Suas opções de personalização do SDK

try {
  DocumentDetectorEvent event = await documentDetector.start();

  if (event is DocumentDetectorEventSuccess) {
// O SDK foi concluído com sucesso, e as fotos do documento foram capturadas.
    resultEvent = "SUCCESS";
    resultDescription = "Tipo de documento: ${event.documentType}\n\n";
// Use `event.captures` para obter os detalhes de cada documento capturado
    for (Capture capture in event.captures!) {
      resultDescription += "#NOVA CAPTURA\n";
      resultDescription += capture.label != null
          ? "Rótulo do documento: ${capture.label!}\n"
          : "vazio\n";
      resultDescription += capture.quality != null
          ? "Qualidade da imagem: ${capture.quality}\n"
          : "vazio\n";
      resultDescription += capture.imagePath != null
          ? "Caminho do arquivo no dispositivo: ${capture.imagePath!}\n"
          : "vazio\n";
      resultDescription += capture.imageUrl != null
          ? "URL do arquivo: ${capture.imageUrl!.split("?")[0]}\n"
          : "vazio\n";
    }
  } else if (event is DocumentDetectorEventFailure) {
// O SDK não foi concluído com sucesso, e ocorreu uma falha durante o processo.
    resultEvent = "FALHA";
    resultDescription = event.securityErrorCode != null
        ? "Código de segurança: ${event.securityErrorCode}\n"
        : "nenhum\n";
    resultDescription += event.errorMessage != null
        ? "Descrição da falha: ${event.errorMessage}\n"
        : "vazio\n";
  } else if (event is DocumentDetectorEventClosed) {
// O SDK foi fechado, o usuário encerrou o processo de captura do documento.
    resultEvent = "FECHADO";
    resultDescription = "O usuário encerrou o fluxo de captura de documentos";
  }
} on PlatformException catch (e) {
// Se ocorrer um erro interno durante o mapeamento da ponte nativa, você pode capturar a exceção desta forma.
  resultEvent = "Erro";
  resultDescription = "Erro ao iniciar o DocumentDetector: ${e.message}";
}
```

### Opções do DocumentDetector

<details>

<summary><code>setStage(CafStage stage)</code></summary>

Usado para redirecionar o SDK para o ambiente desejado na API CAF.

**Opções**

`CafStage.beta` `CafStage.prod`

**Configuração padrão**

`CafStage.prod`

</details>

<details>

<summary><code>setUseAnalytics(bool useAnalytics)</code></summary>

Habilita/desabilita a coleta de dados para fins de análise - logs em casos de bugs e erros ou identificação de perfil de fraude.

**Configuração padrão**

`true`

</details>

<details>

<summary><code>setPersonId(String personId)</code></summary>

Define o identificador do usuário para fins de identificação de perfil de fraude e para auxiliar na identificação de logs de Analytics em casos de bugs e erros.

</details>

<details>

<summary><code>setNetworkSettings(int requestTimeoutInSeconds)</code></summary>

Define o tempo limite das solicitações. Esse valor é representado em segundos.

**Configuração padrão**

Por padrão, o tempo limite é `60s`.

</details>

<details>

<summary><code>setUrlExpirationTime(String urlExpirationTime)</code></summary>

Define o tempo que a URL da imagem permanecerá no servidor até expirar. Espere receber um intervalo de tempo entre `30m` para `30d`.

**`urlExpirationTime` exemplo**

* `30m`: Para definir apenas minutos
* `24h`: Para definir apenas hora(s)
* `1h 10m`: Para definir hora(s) e minuto(s)
* `10d`: Para definir dia(s)

**Configuração padrão**

Por padrão, está definido para `3h`.

</details>

<details>

<summary><code>setDisplayPopup(bool displayPopup)</code></summary>

Ativa/Desativa a pré-visualização com popup das instruções antes de cada etapa de captura de documento.

**Configuração padrão**

`true`

</details>

<details>

<summary><code>setCurrentStepDoneDelayAndroid(bool enableDelay, int millisecondsDelay)</code></summary>

Adie a atividade após a conclusão de cada etapa de captura. Esse valor é representado em `milissegundos`.

**Configuração padrão**

Por padrão, não há atraso.

</details>

<details>

<summary><code>setCurrentStepDoneDelayIOS(int secondsDelay)</code></summary>

Adie a visualização após a conclusão de cada etapa de captura. Esse valor é representado em `segundos`.

**Configuração padrão**

Por padrão, não há atraso.

</details>

<details>

<summary><code>setPreviewSettings(PreviewSettings previewSettings)</code></summary>

Ativa/desativa a pré-visualização da foto do documento para o usuário, para que ele possa verificar se está tudo ok antes de enviá-la.

Crie um arquivo `PreviewSettings` elemento com as configurações desejadas.

**Configuração padrão**

Por padrão, a pré-visualização está desativada.

**Opções de PreviewSettings**

**`bool show`**

Ativa/Desativa o recurso de pré-visualização da captura do documento.

***

**`String? title`**

Personalize o título da visualização.

***

**`String? subtitle`**

Personalize o subtítulo da visualização.

***

**`String? confirmButtonLabel`**

Personalize o texto do botão de confirmação. Esse botão permite ao usuário confirmar e enviar a captura do documento.

***

**`String? retryButtonLabel`**

Personalize o texto do botão de tentar novamente. Esse botão permite ao usuário fazer outra captura.

***

</details>

<details>

<summary><code>setMessageSettings(MessageSettings messageSettings)</code></summary>

Configure mensagens personalizadas que são exibidas durante o processo de captura e análise.

**Opções de MessageSettings**

**`String? waitMessage`**

Mensagem exibida no processo de abertura.

**Padrão**: "Aguarde…"

***

**`String? fitTheDocumentMessage`**

Mensagem que aconselha a encaixar o documento na marcação.

**Padrão**: "Encaixe o documento na marcação"

***

**`verifyingQualityMessage`**

Mensagem exibida quando está verificando a qualidade da captura.

**Padrão**: "Verificando a qualidade…"

***

**`String? lowQualityDocumentMessage`**

Mensagem exibida quando a qualidade da captura é baixa.

**Padrão**: "Ops, não foi possível ler as informações. Tente novamente."

***

**`String? uploadingImageMessage`**

Mensagem exibida quando a captura está sendo enviada aos servidores.

**Padrão**: "Enviando imagem…"

***

**`String? sensorOrientationMessage`**

Mensagem exibida quando a orientação do dispositivo está errada.

**Padrão**: "Aponte a câmera para baixo"

***

**`String? sensorLuminosityMessage`**

Mensagem exibida quando o brilho ambiente é menor do que o esperado.

**Padrão**: "A área ao seu redor está muito escura"

***

**`String? sensorStabilityMessage`**

Mensagem exibida quando o parâmetro de estabilidade do dispositivo indica balanço excessivo.

**Padrão**: "Mantenha o dispositivo parado"

***

**`String? popupDocumentSubtitleMessage`**

Mensagem exibida no popup instrucional, fornecendo orientações sobre como obter a melhor captura do documento.

**Padrão**: "Coloque o documento sobre uma mesa, centralize-o na marcação e aguarde a captura automática."

***

**`String? scanDocumentMessage`**

Mensagem exibida para solicitar que um documento esteja visível na câmera.

**Padrão**: "Escaneie um documento"

***

**`String? getCloserMessage`**

Mensagem exibida para solicitar ao usuário que aproxime a câmera do documento.

**Padrão**: "Aproxime-se do documento"

***

**`String? centralizeDocumentMessage`**

Mensagem exibida para solicitar ao usuário que centralize o documento dentro do enquadramento da câmera.

**Padrão**: "Centralize o documento"

***

**`String? moveAwayMessage`**

Mensagem exibida para solicitar ao usuário que afaste a câmera do documento.

**Padrão**: "Afaste-se do documento"

***

**`String? alignDocumentMessage`**

Mensagem exibida para solicitar ao usuário que alinhe o documento dentro do enquadramento da câmera.

**Padrão**: "Alinhe o documento"

***

**`String? turnDocumentMessage`**

Mensagem exibida para solicitar ao usuário que gire o documento em 90 graus.

**Padrão**: "Gire o documento 90 graus"

***

**`String? documentCapturedMessage`**

Mensagem exibida para notificar que o documento foi capturado com sucesso.

**Padrão**: "Documento capturado"

***

**`String? holdItMessage`**

`Apenas para Android` Mensagem exibida no momento em que a captura está sendo realizada.

**Padrão**: "Mantenha assim"

***

**`String? popupConfirmButtonMessage`**

`Apenas para Android` Personalize o texto do botão de confirmação no popup instrucional.

**Padrão**: "OK, entendi"

***

**`String? wrongDocumentTypeMessage`**

`Apenas para Android` Mensagem exibida quando o documento mostrado pelo usuário não é o esperado para a captura.

**Padrão**: "Ops, este documento não é `${rótulo do documento esperado}`"

***

**`String? unsupportedDocumentMessage`**

`Apenas para Android` Mensagem exibida para informar ao usuário que o documento exibido não é suportado.

**Padrão**: "Ops, parece que este documento não é suportado."

***

**`String? documentNotFoundMessage`**

`Apenas para Android` Mensagem exibida para notificar que nenhum documento foi detectado.

**Padrão**: "Não foi encontrado nenhum documento."

***

</details>

<details>

<summary><code>setUploadSettings(UploadSettings uploadSettings)</code></summary>

Define a configuração para o fluxo de envio de documentos. Ao ativar essa opção, o usuário será solicitado a enviar o arquivo do documento em vez de capturá-lo com a câmera do dispositivo. Essa opção também inclui verificações de qualidade.

Crie um arquivo `UploadSettings` elemento com as configurações desejadas.

**Configuração padrão**

Por padrão, esse recurso está desativado.

**Opções de UploadSettings**

**`bool? compress`**

Ativa/desativa a compressão do arquivo antes do envio. Se ativada, ela segue as definições de Android e iOS para qualidade de compressão:

[`AndroidSettings(int? compressQuality)`](#int-compressquality)

[`IOSSettings(double? captureCompressionQuality)`](#double-capturecompressionquality)

***

**`List<FileFormatAndroid>? fileFormatsAndroid`**

Define o formato de arquivo que será aceito para upload. As opções são:

`.pdf`, `.jpg`, `.jpeg`, `.png`, `.heif`.

***

**`List<FileFormatIOS>? fileFormatsIOS`**

Define o formato de arquivo que será aceito para upload. As opções são:

`.pdf`, `.jpeg`, `.png`.

***

**`int? maxFileSize`**

Especifica o tamanho máximo do arquivo para upload, em kilobytes (kB).

`1000kB = 1MB`.

O valor padrão é `10MB`.

***

</details>

<details>

<summary><code>setCountryCodeList(List&#x3C;CountryCodesList>? countryCodeList)</code></summary>

Restrinja a aceitação de documentos de passaporte àqueles emitidos apenas por um país específico ou por uma lista predefinida de países.

Crie um arquivo `List<CountryCodesList>` com os códigos dos países desejados.

**`countryCodeList` exemplo**

```dart
List<CountryCodesList> countryCodeList = [
    CountryCodesList.arg,
    CountryCodesList.bra,
    CountryCodesList.usa
];
```

</details>

<details>

<summary><code>setAndroidSettings(AndroidSettings androidSettings)</code></summary>

Defina as configurações exclusivas da plataforma Android.

Crie um `AndroidSettings` elemento com as configurações desejadas.

```dart
AndroidSettings androidSettings = AndroidSettings(
    captureStages: customStages,
    cameraResolution: AndroidCameraResolution.fullHd,
    compressQuality: 90,
    customStyle: "custom_style_res_name",
    feedbackColors: customFeedbackColors,
    sensorSettings: customSensorSettings,
    securitySettings: customSecuritySettings);


List<CaptureStage> customStages = [
    CaptureStage(
        captureMode: CaptureMode.automatic,
        wantSensorCheck: true,
        durationMillis: 5000),
    CaptureStage(
        captureMode: CaptureMode.manual,
        wantSensorCheck: true,
        durationMillis: null),
];

SensorSettingsAndroid customSensorSettings = SensorSettingsAndroid(
    luminositySensorSettings: 5,
    orientationSensorSettings: 3.0,
    stabilitySensorSettings: StabilitySensorSettings(
        stabilityThreshold: 0.5, stabilityDurationMillis: 2000));

SecuritySettings customSecuritySettings = SecuritySettings(
    enableGoogleServices: true,
    useAdb: false,
    useDebug: false,
    useDeveloperMode: false,
    useEmulator: false,
    useRoot: false);

FeedbackColorsAndroid customFeedbackColors = FeedbackColorsAndroid(
    defaultFeedback: "custom_default_color_res_name",
    successFeedback: "custom_success_color_res_name",
    errorFeedback: "custom_error_color_res_name");
```

**opções AndroidSettings**

**`SensorSettingsAndroid? sensorSettings`**

Configure os parâmetros do sensor de luminosidade ambiente, orientação do dispositivo e estabilidade para garantir que o documento seja capturado em condições ideais.

```dart
SensorSettingsAndroid customSensorSettings = SensorSettingsAndroid(
    luminositySensorSettings: 5,
    orientationSensorSettings: 3.0,
    stabilitySensorSettings: StabilitySensorSettings(
        stabilityThreshold: 0.5, stabilityDurationMillis: 2000),
    disableLuminositySensor: false,
    disableOrientationSensor: false,
    disableStabilitySensor: false);
```

**`int? luminositySensorSettings`**

Define o limite entre brilho ambiente aceitável/inaceitável.

Quanto menor o valor definido, menos sensível o sensor de orientação será.

Defina `disableLuminositySensor: true` se você não quiser usar este sensor.

**Configuração padrão**

As configurações padrão são `5` *lx*.

***

**`double? orientationSensorSettings`**

Define o limite entre orientação correta/incorreta do dispositivo.

Quanto maior o valor definido, menos sensível o sensor de orientação será.

Defina `disableOrientationSensor: true` se você não quiser usar este sensor.

**Configuração padrão**

A configuração padrão é `3.0` *m/s²*

***

**`StabilitySensorSettings? stabilitySensorSettings`**

Define as configurações do sensor de estabilidade.

**`double stabilityThreshold`**

Define o limite entre estável/instável, na variação em m/s² entre as duas últimas coletas do sensor. Quanto maior o valor definido, menos sensível o sensor de estabilidade será.

***

**`int stabilityDurationMillis`**

Especifica a duração, em milissegundos, que o dispositivo deve permanecer parado para ser considerado estável.

Defina `disableStabilitySensor: true` se você não quiser usar este sensor.

**Configuração padrão**

A configuração padrão é `stabilityDurationMillis: 2000` e `stabilityThreshold: 0.5`

***

**`List<CaptureStage>? captureStages`**

CaptureStage é um recurso que determina o nível de exigência para a captura do documento. Assim que o fluxo de captura de documento começa, um temporizador é ativado. Durante o tempo definido, as configurações especificadas em cada uma das etapas configuradas são aplicadas. É possível definir uma lista de CaptureStages para aliviar gradualmente os requisitos de captura do documento ao longo do tempo. Esse recurso existe devido à diversidade de hardware de câmera em dispositivos Android, evitando que o usuário fique preso no fluxo de captura de documento durante seu onboarding.

**`captureStages` exemplo**

```dart
List<CaptureStage> customStages = [
    CaptureStage(
        captureMode: CaptureMode.automatic,
        wantSensorCheck: true,
        durationMillis: 5000),
    CaptureStage(
        captureMode: CaptureMode.manual,
        wantSensorCheck: true,
        durationMillis: null),
];
```

**Configuração padrão**

A configuração padrão consiste na seguinte ordem de `CaptureStages`:

* **CaptureStage 1**: `captureMode: CaptureMode.automatic`, `wantSensorCheck: true`, `durationMillis: 30000`;
* **CaptureStage 2**: `captureMode: CaptureMode.automatic`, `wantSensorCheck: false`, `durationMillis: 15000`;
* **CaptureStage 3**: `captureMode: CaptureMode.manual`, `wantSensorCheck: false`, `durationMillis: null`;

***

**`int? compressQuality`**

Defina a qualidade no processo de compressão. Por padrão, todas as capturas passam por compressão.

O valor deve estar entre `80` e `100`, em que 100 é a maior qualidade de compressão.

**Configuração padrão**

A qualidade padrão de compressão é `90`.

***

**`AndroidCameraResolution? cameraResolution`**

Defina a resolução da captura do documento.

As opções são `fullHd`, `quadHd` e `ultraHd`.

**Configuração padrão**

Por padrão, a resolução é `fullHd`.

***

**`SecuritySettings? securitySettings`**

Estamos constantemente tomando medidas para tornar o produto cada vez mais seguro, mitigando uma série de ataques observados no processo de captura e, consequentemente, reduzindo o máximo possível de fraudes de identidade. O SDK possui alguns bloqueios que podem impedir sua execução em determinados contextos. Você pode desativar essas validações para fins de teste.

{% hint style="warning" %}
Desativar as validações de segurança é recomendado apenas para fins de teste. Para publicar seu aplicativo em produção, recomendamos usar as configurações padrão.
{% endhint %}

Para configurar as validações de segurança, você pode usar estas opções:

**`bool? enableGoogleServices`**

Permite ativar ou desativar recursos do SDK que utilizam os Serviços do Google.

***

**`bool? useRoot`**

Permite ativar ou desativar o SDK para ser executado em dispositivos com root.

***

**`bool? useEmulator`**

Permite ativar ou desativar o SDK para ser executado em dispositivos emulados.

***

**`bool? useDeveloperMode`**

Permite ativar ou desativar o SDK para ser executado em dispositivos com o modo de desenvolvedor ativado.

***

**`bool? useAdb`**

Permite ativar ou desativar o SDK para ser executado no modo de depuração Android Debug Bridge (ADB).

***

**`bool? useDebug`**

Permite ativar ou desativar o SDK para ser executado em um aplicativo em modo de depuração.

***

**Configuração padrão**

```dart
SecuritySettings securitySettings = SecuritySettings(
    enableGoogleServices: true,
    useAdb: false,
    useDebug: false,
    useDeveloperMode: false,
    useEmulator: false,
    useRoot: false);
```

***

**`String? customStyle`**

Defina o estilo personalizado do seu app para alterar a cor primária do SDK.

Para personalizar, crie um `style.xml` arquivo de recurso no seu app e adicione este trecho de estilo a ele, substituindo os valores dentro dos placeholders:

```xml
<resources>
  <style name={style_name} parent={parent_name}>
    <item name="colorPrimary">{custom_color_hex}</item>
  </style>
</resources>
```

***

**`FeedbackColorsAndroid? feedbackColors`**

Personalize as cores de feedback da interface a serem exibidas.

Para personalizar as cores de feedback da interface no seu app, siga estas etapas:

* Crie um arquivo `colors.xml` arquivo de recurso no diretório `res/values` do seu app.
* Defina as cores para os diferentes tipos de feedback: `padrão`, `sucesso`e `error`.

Aqui está uma versão aprimorada do `colors.xml` arquivo com placeholders para os valores hexadecimais das cores:

```xml
<resources>
 <color name="feedback_default">{default_color}</color>
 <color name="feedback_success">{success_color}</color>
 <color name="feedback_error">{error_color}</color>
</resources>
```

</details>

<details>

<summary><code>setIOSSettings(IOSSettings iosSettings)</code></summary>

Defina configurações exclusivas da plataforma iOS.

Crie um `IOSSettings` elemento com as configurações desejadas.

```dart
IOSSettings iosSettings = IOSSettings(
    cameraResolution: IOSCameraResolution.fullHd,
    captureCompressionQuality: 0.90,
    sensorSettings: customSensorSettings,
    enableMultiLanguage: true,
    enableManualCapture: false,
    manualCaptureActivationDelay: 45,
    customLayout: customLayout);

SensorSettingsIOS customSensorSettings = SensorSettingsIOS(
    luminositySensorSettings: -3,
    orientationSensorSettings: 0.3,
    stabilitySensorSettings: 0.3);

CustomLayoutIOS customLayout = CustomLayoutIOS(
    feedbackColors: FeedbackColorsIOS(
        defaultFeedback: "#000000",
        successFeedback: "#e21b45",
        errorFeedback: "#0baa43"),
    primaryColor: "#34D690");
```

**`SensorSettingsIOS? sensorSettings`**

Configure os parâmetros de limiar do sensor de luminosidade ambiente, orientação do dispositivo e estabilidade para garantir que o documento seja capturado em condições ideais.

```dart
SensorSettingsIOS customSensorSettings = SensorSettingsIOS(
    luminositySensorSettings: -3,
    orientationSensorSettings: 0.3,
    stabilitySensorSettings: 0.3);
```

**`double? luminositySensorSettings`**

Define o limite entre brilho ambiente aceitável/inaceitável.

Quanto menor o valor definido, menos sensível o sensor de orientação será.

**Configuração padrão**

A configuração padrão é `-3`.

***

**`double? orientationSensorSettings`**

Define o limite entre orientação correta/incorreta do dispositivo com base na variação das duas últimas leituras do sensor acelerômetro coletadas do dispositivo.

Quanto maior o valor definido, menos sensível o sensor de orientação será.

**Configuração padrão**

A configuração padrão é `0.3`.

***

**`double? stabilitySensorSettings`**

Define o limite entre dispositivo estável/instável com base na variação das duas últimas leituras do sensor giroscópio coletadas do dispositivo.

Quanto maior o valor definido, menos sensível o sensor de estabilidade será.

**Configuração padrão**

A configuração padrão é `0.3`.

***

**`double? captureCompressionQuality`**

Defina a qualidade no processo de compressão. Por padrão, todas as capturas passam por compressão. O método espera valores entre `0.8` e `1.0` como parâmetro, em que `1.0` é a melhor qualidade de compressão.

**Configuração padrão**

A qualidade padrão de compressão é `0.9`.

***

**`bool? enableManualCapture`**

Ative a opção de captura manual. Com esta configuração `ativado`, você pode especificar o tempo - em segundos - até que a captura manual seja ativada usando o [`manualCaptureActivationDelay`](#int-manualcaptureactivationdelay) parâmetro.

**Configuração padrão**

Por padrão, a captura manual está definida como `false`.

Em dispositivos abaixo do iOS 13, este recurso está sempre `true`, não há captura automática.

***

**`int? manualCaptureActivationDelay`**

Defina o atraso de tempo para habilitar a opção de captura manual para o usuário.

Para habilitar o recurso de captura manual, use `enableManualCapture: true` parâmetro.

**Configuração padrão**

Por padrão, o temporizador é definido como `45` segundos.

***

**`bool? enableMultiLanguage`**

Esta configuração ativa ou desativa o suporte a vários idiomas (inglês, espanhol, português brasileiro). Se desativado, o idioma padrão será o português brasileiro.

**Configuração padrão**

`true`

***

**`IOSCameraResolution? cameraResolution`**

Defina a resolução da captura do documento.

As opções são `fullHd` e `ultraHd`.

**Configuração padrão**

Por padrão, a resolução é `fullHd`.

***

**`CustomLayoutIOS? customLayout`**

Personalize as configurações de layout do seu app iOS.

Nessas opções você pode alterar a cor dos botões, a cor dos feedbacks da interface e a fonte do app.

```dart
CustomLayoutIOS customLayout = CustomLayoutIOS(
    feedbackColors: FeedbackColorsIOS(
        defaultFeedback: "#000000",
        successFeedback: "#e21b45",
        errorFeedback: "#0baa43"),
    primaryColor: "#34D690");
```

</details>

## Resultados do DocumentDetectorEvent

`DocumentDetectorEvent` é uma classe abstrata que representa diferentes tipos de eventos.

É usada para criar uma instância de uma das subclasses de evento com base em uma entrada de mapa, que vem do resultado do SDK.

Dependendo do tipo de evento, cria uma instância de `DocumentDetectorEventClosed`, `DocumentDetectorEventSuccess`, ou `DocumentDetectorEventFailure`. Se o evento não for reconhecido, lança uma exceção interna.

Essa configuração permite uma forma estruturada e segura em relação a tipos para lidar com diferentes resultados do processo de captura de documento no SDK.

```dart
try {
  DocumentDetectorEvent event = await documentDetector.start();

  if (event is DocumentDetectorEventSuccess) {
// O SDK foi concluído com sucesso, e as fotos do documento foram capturadas.
    for (Capture capture in event.captures!) {
// Use `event.captures` para obter os detalhes de cada documento capturado         
    }
  } else if (event is DocumentDetectorEventFailure) {
// O SDK não foi concluído com sucesso, e ocorreu uma falha durante o processo.
  } else if (event is DocumentDetectorEventClosed) {
// O SDK foi fechado, o usuário encerrou o processo de captura do documento.
  }
} on PlatformException catch (e) {
// Se ocorrer um erro interno durante o mapeamento da ponte nativa, você pode capturar a exceção desta forma.
}
```

### `DocumentDetectorEventClosed`

Esta classe representa um evento em que a captura do documento foi encerrada pelo usuário, seja ao pressionar o botão de fechar no canto superior direito ou ao enviar o app para segundo plano.

### `DocumentDetectorEventSuccess`

Esta classe representa um evento de captura de documento bem-sucedido. O documento do usuário foi capturado com sucesso, e as URLs para download das capturas foram retornadas. Inclui:

<details>

<summary><code>List&#x3C;Capture>? captures</code></summary>

Uma lista de `Captura` objetos que representam os documentos capturados. `Captura` inclui:

**`String? imagePath`**

Caminho completo do arquivo de imagem no dispositivo do usuário.

***

**`String? imageUrl`**

URL do arquivo do documento no servidor da Caf. Esta URL tem um tempo de expiração, que pode ser definido com o [`setUrlExpirationTime`](#urlexpirationtime-example) método.

***

**`String? label`**

Rótulo do documento capturado, por exemplo: `cnh_front`, `rg_back`, `passport`...

***

**`double? quality`**

Qualidade inferida pelo algoritmo de qualidade do documento, variando entre `0` e `5`.

***

</details>

#### `String? documentType`

O tipo do documento capturado

#### `String? trackingId`

Um ID para rastrear a execução da captura.

### `DocumentDetectorEventFailure`

Esta classe representa uma falha no processo de captura de documento. O documento do usuário não foi capturado com sucesso, o `errorType` e `errorMessage` parâmetro contém o motivo da falha. Inclui:

#### `String? errorType`

Informações sobre o tipo de erro retornado pelo SDK. Abaixo estão os tipos de erro e suas causas:

{% tabs %}
{% tab title="Android" %}

| Tipo                 | Motivo                                                                                      | Exemplo                                                                                                                          |
| -------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `AvailabilityReason` | O SDK ainda não está disponível para uso. O `errorMessage` parâmetro trará mais instruções. | O armazenamento interno do dispositivo está cheio ao instalar o app, e o modelo de detecção facial não pode ser instalado junto. |
| `InvalidTokenReason` | O token informado não é válido para o produto correspondente.                               | Se você estiver usando um token expirado ou inexistente.                                                                         |
| `LibraryReason`      | Quando uma biblioteca interna do SDK não pode ser iniciada.                                 | Esquecer de definir o `aaptOptions` [noCompress](#platform-configurations) configuração causará essa falha no DocumentDetector.  |
| `NetworkReason`      | Falha na conexão com a internet.                                                            | O usuário estava sem internet durante a execução do SDK.                                                                         |
| `PermissionReason`   | Está faltando alguma permissão obrigatória para executar o SDK.                             | Iniciar o SDK sem a permissão da câmera concedida.                                                                               |
| `SecurityReason`     | Quando o SDK não pode ser iniciado por um motivo de segurança.                              | Quando o dispositivo está com root. Consulte [código de erro de segurança](#int-securityerrorcode) para mais motivos.            |
| `ServerReason`       | Quando uma solicitação do SDK recebe um código de status de falha.                          | Se uma API interna estiver instável.                                                                                             |
| `StorageReason`      | Não há espaço no armazenamento interno do dispositivo do usuário.                           | Quando não há espaço no armazenamento interno durante a captura da foto do documento.                                            |
| {% endtab %}         |                                                                                             |                                                                                                                                  |

{% tab title="iOS" %}

| Tipo                 | Motivo                                                             | Exemplo                                                                               |
| -------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------- |
| `InvalidTokenReason` | O token informado não é válido para o produto correspondente.      | Se você estiver usando um token expirado ou inexistente.                              |
| `NetworkReason`      | Falha na conexão com a internet.                                   | O usuário estava sem internet durante a execução do SDK.                              |
| `PermissionReason`   | Está faltando alguma permissão obrigatória para executar o SDK.    | Iniciar o SDK sem a permissão da câmera concedida.                                    |
| `ServerReason`       | Quando uma solicitação do SDK recebe um código de status de falha. | Se uma API interna estiver instável.                                                  |
| `StorageReason`      | Não há espaço no armazenamento interno do dispositivo do usuário.  | Quando não há espaço no armazenamento interno durante a captura da foto do documento. |
| {% endtab %}         |                                                                    |                                                                                       |
| {% endtabs %}        |                                                                    |                                                                                       |

#### `String? errorMessage`

Uma mensagem que descreve o erro.

#### `int? securityErrorCode`

Um código de erro específico do Android, indicando o tipo de falha na validação de segurança:

* `100` - bloqueando dispositivos emulados;
* `200` - bloqueando dispositivos com root;
* `300` - bloqueando dispositivos com opções de desenvolvedor ativadas;
* `400` - bloqueando dispositivos com ADB ativado;
* `500` - bloqueando dispositivos com depuração ativada;


---

# 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/flutter/standalone-modules/deprecated-sdks/document-detector/v7-and-above.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.
