PassiveFaceLiveness - Flutter Plugin
Plugin que chama os SDKs nativos em Android e iOS. Caso tenha alguma dúvida, envie um email para o nosso Head of Mobile
Políticas de privacidade e termos e condições de uso
Ao utilizar nosso plugin, certifique-se que você concorda com nossas Políticas de privacidade e nossos Termos e condições de uso.
Pré requisitos
Configuração mínima | Versão |
---|---|
Flutter | 1.12+ |
Dart | 2.12+ |
Android API | 21+ |
iOS | 11.0+ |
Caso você utilize Dart em uma versão abaixo de 2.12, confira a versão compatível aqui.
Configurações
Android
No arquivo ROOT_PROJECT/android/app/build.gradle
, adicione:
android {
...
dataBinding.enabled = true
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
iOS
No arquivo ROOT_PROJECT/ios/Podfile
, adicione no final do arquivo:
source 'https://github.com/combateafraude/iOS.git'
source 'https://cdn.cocoapods.org/' # ou 'https://github.com/CocoaPods/Specs' se o CDN estiver fora do ar
Por último, adicione a permissão de câmera no arquivo ROOT_PROJECT/ios/Runner/Info.plist
:
<key>NSCameraUsageDescription</key>
<string>To capture the selfie</string>
Para habilitar texto e voz em Português, em seu projeto, no diretório ROOTPROJECT/ios, abra o arquivo .xcworkspace no Xcode e adicione em Project > Info > Localizations o idioma Portuguese (Brazil).
Flutter
Adicione o plugin no seu arquivo ROOT_PROJECT/pubspec.yaml
:
Estável
dependencies:
passive_face_liveness:
git:
url: https://github.com/combateafraude/Flutter.git
ref: passive-face-liveness-v4.28.1
Release Candidate
dependencies:
passive_face_liveness:
git:
url: https://github.com/combateafraude/Flutter.git
ref: passive-face-liveness-v4.28.0-rc01
Utilização
PassiveFaceLiveness passiveFaceLiveness = new PassiveFaceLiveness(mobileToken: mobileToken);
// Outros parâmetros de customização
PassiveFaceLivenessResult passiveFaceLivenessResult = await passiveFaceLiveness.start();
if (passiveFaceLivenessResult is PassiveFaceLivenessSuccess) {
// O SDK foi encerrado com sucesso e a selfie foi capturada
} else if (passiveFaceLivenessResult is PassiveFaceLivenessFailure) {
// O SDK foi encerrado devido à alguma falha e a selfie não foi capturada
} else {
// O usuário simplesmente fechou o SDK, sem nenhum resultado
}
Desativando validações de segurança para teste
Estamos constantemente realizando ações para tornar o produto cada vez mais seguro, mitigando uma série de ataques observados ao processo de captura e, consequentemente, reduzindo o maior número de possíveis fraudes de identidade. O SDK possui alguns bloqueios que podem impedir a execução em certos contextos. Para desabilitá-los, você pode utilizar os métodos conforme o exemplo abaixo:
PassiveFaceLivenessAndroidSettings androidSettings =
PassiveFaceLivenessAndroidSettings(
emulatorSettings: true,
rootSettings: true,
useDeveloperMode: true,
useAdb: true,
useDebug: true,
);
passiveFaceLiveness.setAndroidSettings(androidSettings);
Atenção! Desabilitar as validações de segurança são recomendadas apenas para ambiente de testes. Para publicação do seu aplicativo em produção, recomendamos utilizar as configurações padrão.
Customizações gerais
PassiveFaceLiveness |
---|
.setPeopleId(String peopleId) CPF do usuário que está utilizando o plugin à ser usado para detecção de fraudes via analytics |
.setPersonName(String personName) Vincula uma tentativa de prova de vida a um nome |
.setPersonCPF(String personCPF) Vincula uma tentativa de prova de vida a um cpf |
.setAnalyticsSettings(bool useAnalytics) Habilita/desabilita a coleta de dados para maximização da informação antifraude. O padrão é true |
.setAudioSettings(bool enable, String audioResIdName) Habilita/desabilita os sons. Permite customizar o áudio utilizado pelo SDK. Caso deseje mudar o áudio do SDK, adicione o arquivo de audio em ROOT_PROJECT/android/app/src/main/res/raw/ com o nome desejado seguindo e o parametrize |
.setShowPreview(ShowPreview showPreview) Preview para verificação de qualidade da foto |
.setCaptureMode(VideoCapture videoCapture, ImageCapture imageCapture) Define as configurações de captura |
.setGetImageUrlExpireTime(String expireTime) Define o tempo de duração da URL da imagem no servidor até ser expirada. Espera receber um intervalo de tempo entre "30m" à "30d". O padrão é 3h |
.setMessageSettings(MessageSettings messageSettings) Permite personalizar as mensagens exibidas no balão de "status" durante o processo de captura e análise |
.setCurrentStepDoneDelay(bool showDelay, int delay) Aplica delay na activity após a finalização de cada etapa. Esse método pode ser utilizado para exibir uma mensagem de sucesso na própria tela após a captura, por exemplo. O padrão é false |
.setAndroidSettings(PassiveFaceLivenessAndroidSettings androidSettings) Customizações somente aplicadas em Android |
.setIosSettings(PassiveFaceLivenessIosSettings iosSettings) Customizações somente aplicadas em iOS |
.setEyesClosedSettings(bool enable, double threshold) Permite customizar a validação de olhos abertos no SDK |
.setCaptureProcessingErrorMessage(@NonNull @StringRes Integer message) Permite customizar a mensagem exibida quando ocorre um problema no processamento ou erro na response da API. |
ImageCapture constructor |
---|
bool use Habilita/desabilita a captura de um frame. O padrão é true |
int beforePictureMillis Duração em milissegundos entre a primeira detecção do rosto e a efetiva captura da foto. O padrão é 0 ms |
int afterPictureMillis Duração em milissegundos entre a captura da foto e o envio para o servidor para o mantimento do rosto e dos sensores válidos. O padrão é 2000 ms |
VideoCapture constructor |
---|
bool use Habilita/desabilita a captura por vídeo. O padrão é false |
int time Estabelece o tempo do vídeo que será capturado. O padrão é 3s |
ShowPreview |
---|
bool show Habilita/Desabilita preview |
String title Título |
String subTitle Subtítulo |
String confirmLabel Texto do botão de confirmação |
String retryLabel Texto do botão de capturar novamente |
| Exemplo de uso |
ShowPreview showPreview = new ShowPreview(
show: true,
title: "A foto ficou boa?",
subTitle: "Veja se a foto está nítida",
confirmLabel: "Sim, ficou boa!",
retryLabel: "Tirar novamente");
passiveFaceLiveness.setShowPreview(showPreview);
MessageSettings |
---|
String stepName Padrão: "Registro Facial" |
String holdItMessage Padrão: "Segure assim" |
String faceNotFoundMessage Padrão: "Não encontramos nenhum rosto" |
String faceTooFarMessage Padrão: "Aproxime o rosto" |
String faceTooCloseMessage (somente para Android) Padrão: "Afaste o rosto" |
String faceNotFittedMessage Padrão: "Encaixe seu rosto" |
String multipleFaceDetectedMessage Padrão: "Mais de um rosto detectado" |
String verifyingLivenessMessage Padrão: "Verificando selfie…" |
String invalidFaceMessage Padrão: "Ops, rosto inválido. Por favor, tente novamente" |
String? sensorStabilityMessage Padrão: "Mantenha o celular parado" |
String? captureProcessingErrorMessage Padrão: "Ops, tivemos um problema ao processar sua imagem. Tente novamente." |
String multipleFaceDetectedMessage Padrão: "Mais de um rosto detectado" |
String? sensorOrientationMessage (somente para Android) Padrão: "Celular não está na vertical" |
String eyesClosedMessage (somente para Android) Padrão: "Seus olhos estão fechados" |
String notCenterXMessage (somente para Android) Padrão: "Centralize seu rosto na vertical" |
String notCenterYMessage (somente para Android) Padrão: "Centralize seu rosto na horizontal" |
String notCenterZMessage (somente para Android) Padrão: "Seu rosto não está ajustado à máscara" |
| Exemplo de uso |
MessageSettings messageSettings = new MessageSettings(
stepName: "Mensagem de exemplo",
faceNotFoundMessage: "Mensagem de exemplo",
faceTooFarMessage: "Mensagem de exemplo",
faceTooCloseMessage: "Mensagem de exemplo",
faceNotFittedMessage: "Mensagem de exemplo",
multipleFaceDetectedMessage: "Mensagem de exemplo",
verifyingLivenessMessage: "Mensagem de exemplo",
holdItMessage: "Mensagem de exemplo",
invalidFaceMessage: "Mensagem de exemplo");
passiveFaceLiveness.setMessageSettings(messageSettings);
Android
PassiveFaceLivenessAndroidSettings constructor |
---|
PassiveFaceLivenessCustomizationAndroid customization Customização do layout em Android da activity |
SensorSettingsAndroid sensorSettings Customização das configurações dos sensores de captura |
int showButtonTime Altera o tempo para a exibição do botão de captura manual. O padrão é 20000 milisegundos |
bool enableSwitchCameraButton Permite habilitar ou desabilitar o botão de inversão da câmera. O padrão é True |
bool enableGoogleServices Permite habilitar/desabilitar recursos do SDK que consomem GoogleServices no SDK, não recomendamos desabilitar os serviços por conta da perda de segurança. O padrão é True |
bool emulatorSettings Permite habilitar/desabilitar o uso de dispositivos emulados no SDK. Recomendamos desabilitar o uso dos emuladores por questões de segurança. O padrão é False |
bool rootSettings Permite habilitar/desabilitar o uso de dispositivos com root no SDK. Recomendamos desabilitar o uso desses dispositivos por questões de segurança. O padrão é False |
bool useDeveloperMode Permite habilitar/desabilitar o uso de dispositivos com o modo de desenvolvedor Android ativado. Recomendamos desabilitar o uso desses dispositivos por questões de segurança. O padrão é False |
bool useAdb Permite habilitar/desabilitar o uso do modo de depuração Android Debug Bridge (ADB). Recomendamos desabilitar o uso desses dispositivos por questões de segurança. O padrão é False |
bool useAdb Habilita/desabilita o uso do app em modo depuração. O padrão é False |
bool enableBrightnessIncrease Habilita/desabilita o incremento de brilho do dispositivo do dispositivo na abertura do SDK |
PassiveFaceLivenessCustomizationAndroid constructor |
---|
String styleResIdName Nome do style resource que define as cores do SDK. Por exemplo, caso deseje mudar as cores do SDK, crie um style em ROOT_PROJECT/android/app/src/main/res/values/styles.xml com o nome R.style.my_custom_style seguindo o template e parametrize "my_custom_style" |
String layoutResIdName Nome do layout resource que substituirá o layout padrão do SDK. Por exemplo, caso deseje mudar o layout do SDK, crie um layout em ROOT_PROJECT/android/app/src/main/res/layout/my_custom_layout.xml seguindo o template e parametrize "my_custom_layout" |
String greenMaskResIdName Nome do drawable resource à substituir a máscara verde padrão. Caso for usar este parâmetro, use uma máscara com a mesma área de corte, é importante para o algoritmo de detecção. Por exemplo, salve a imagem da máscara em ROOT_PROJECT/android/app/src/main/res/drawable/my_custom_green_mask.png e parametrize "my_custom_green_mask" |
String redMaskResIdName Nome do drawable resource à substituir a máscara vermelha padrão. Caso for usar este parâmetro, use uma máscara com a mesma área de corte, é importante para o algoritmo de detecção. Por exemplo, salve a imagem da máscara em ROOT_PROJECT/android/app/src/main/res/drawable/my_custom_red_mask.png e parametrize "my_custom_red_mask" |
String whiteMaskResIdName Nome do drawable resource à substituir a máscara branca padrão. Caso for usar este parâmetro, use uma máscara com a mesma área de corte, é importante para o algoritmo de detecção. Por exemplo, salve a imagem da máscara em ROOT_PROJECT/android/app/src/main/res/drawable/my_custom_white_mask.png e parametrize "my_custom_white_mask" |
MaskType maskType Define o tipo de máscara utilizada nas capturas. Existem dois tipos: MaskType.DEFAULT, com o padrão pontilhado e MaskType.NONE, que remove completamente a máscara. O padrão é MaskType.DEFAULT |
SensorSettingsAndroid constructor |
---|
SensorStabilitySettingsAndroid sensorStabilitySettings Configurações do sensor de estabilidade à ser aplicado em todos os passos do SDK |
SensorOrientationAndroid sensorOrientationAndroid Configurações do sensor de orientação à ser aplicado em todos os passos do SDK |
SensorStabilitySettingsAndroid constructor |
---|
int stabilityStabledMillis Quantos milissegundos o celular deve se manter no limiar correto para ser considerado estável. O padrão é 1500 ms |
double stabilityThreshold Limiar entre estável/instável, em variação de m/s² entre as últimas duas coletas do sensor. O padrão é 0.7 m/s² |
SensorOrientationAndroid constructor |
---|
double stabilityThreshold Limiar entre estável/instável, em variação de m/s² entre as últimas duas coletas do sensor. O padrão é 4 m/s² |
iOS
PassiveFaceLivenessIosSettings constructor |
---|
PassiveFaceLivenessCustomizationIos customization Customização visual do SDK |
int beforePictureMillis Duração em milissegundos entre a primeira detecção do rosto e a efetiva captura da foto |
SensorStabilitySettingsIos sensorStability Configurações do sensor de estabilidade à ser aplicado no SDK |
bool enableManualCapture Habilita modo de captura manual |
double timeEnableManualCapture Define tempo (em segundos) para exibição do botão de captura manual |
double compressionQuality Permite configurar a qualidade no processo de compressão. Por padrão, todas capturas passam por compressão. O método espera como parâmetro valores entre 0 e 1.0, sendo 1.0 a compressão com melhor qualidade (recomendado).O padrão é 1.0 |
String resolution Permite configurar a resolução de captura. O método espera como parâmetro uma String IosResolution (O padrão é hd1280x720 ), que possui as seguintes opções: |
Resolution | Descrição |
---|---|
low |
Especifica as configurações de captura adequadas para vídeo de saída e taxas de bits de áudio adequadas para compartilhamento em 3G |
medium |
Especifica as configurações de captura adequadas para as taxas de bits de áudio e vídeo de saída adequadas para compartilhamento via WiFi |
high |
Especifica as configurações de captura adequadas para saída de áudio e vídeo de alta qualidade |
photo |
Especifica as configurações de captura adequadas para saída de qualidade de foto de alta resolução |
inputPriority |
Especifica as configurações de captura adequadas para saída de qualidade de foto de alta resolução |
hd1280x720 |
Especifica as configurações de captura adequadas para saída de vídeo com qualidade de 720p (1280 x 720 pixels) |
hd1920x1080 |
Configurações de captura adequadas para saída de vídeo com qualidade 1080p (1920 x 1080 pixels) |
hd4K3840x2160 |
Configurações de captura adequadas para saída de vídeo com qualidade 2160p (3840 x 2160 pixels) |
PassiveFaceLivenessCustomizationIos constructor |
---|
String? colorHex Cor tema do SDK. Por exemplo, caso deseje usar a cor preta, utilize "#000000" |
String? greenMaskImageName Nome da imagem à substituir a máscara verde padrão. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
String? whiteMaskImageName Nome da imagem à substituir a máscara branca padrão. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
String? redMaskImageName Nome da imagem à substituir a máscara vermelha padrão. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
String? closeImageName Nome da imagem à substituir o botão de fechar o SDK. Lembre de adicionar a imagem em Assets Catalog Document no seu projeto do XCode |
bool? showStepLabel Flag que indica se deseja mostrar o label do passo atual |
bool? showStatusLabel Flag que indica se deseja mostrar o label do status atual |
double? buttonSize Valor que define o tamanho do botão de "fechar" o SDK |
String? buttonContentMode Atributo que define o content mode do botão de "fechar" o SDK. Escolha entre esses valores. |
SensorStabilitySettingsIos constructor |
---|
String message String à ser mostrada quando o celular não estiver estável |
double stabilityThreshold Limiar inferior entre estável/instável, em variação de m/s² entre as últimas duas coletas do sensor. O padrão é 0.3 m/s² |
Coletando o resultado
O objeto de retorno do PassiveFaceLiveness é do tipo abstrato PassiveFaceLivenessResult
. Ele pode ser uma instância de PassiveFaceLivenessSuccess
, PassiveFaceLivenessFailure
ou PassiveFaceLivenessClosed
.
PassiveFaceLivenessSuccess
Campo |
---|
String imagePath Endereço completo da imagem no dispositivo |
String capturePath Endereço completo do vídeo no dispositivo. Caso o formato de captura não seja por vídeo, o retorno é null |
String imageUrl URL da imagem armazenada temporariamente nos servidores da CAF |
String signedResponse Resposta assinada do servidor da CAF que confirmou que a selfie capturada possui um rosto verdadeiro (não é foto de foto ou vídeo). Utilize esse parâmetro caso queira uma camada extra de segurança verificando se a assinatura da resposta não está quebrada, provocada por uma interceptação da requisição. Se estiver quebrada, há um grande indício de interceptação da requisição |
String trackingId Identificador dessa execução em nossos servidores. Se possível, salve este campo e mande-o junto para nossa API. Assim, teremos mais dados de como o usuário se comportou durante a execução |
PassiveFaceLivenessFailure
Campo |
---|
String message Mensagem amigável explicando o motivo da falha do SDK |
String type Tipo de falha que encerrou o SDK |
Os tipos de falha existentes são:
InvalidTokenReason
: quando o token informado é inválido. Não deve ocorrer em um ambiente de produção;PermissionReason
: quando alguma permissão obrigatória não foi concedida pelo usuário. Só ocorrerá em um ambiente de produção se o seu app não solicitar ao seu usuário ou o mesmo desabilitar manualmente antes de iniciar;NetworkReason
: falha de conexão com o servidor. Ocorrerá em produção se o dispositivo do usuário estiver sem internet;ServerReason
: falha em alguma requisição com nossos servidores. Ocorrerá em produção somente no caso de uma falha nossa;SecurityReason
: quando o dispositivo não é seguro para executar o SDK. Se esta falha ocorrer, avise-nos;StorageReason
: quando o dispositivo não possui espaço suficiente para a captura de alguma foto. Pode ocorrer em produção;LibraryReason
: quando alguma falha interna impossibilitou a execução do SDK. Pode ocorrer devico à erros de configuração do projeto, não deve ocorrer em produção;
Customizando view iOS
Para customização iOS, é necessário que os plugins Flutter estejam adicionados localmente no projeto. A customizção é realizada nativamente com a abordagem ViewCode.
Clique aqui e acesse o exemplo com um guia para utilização desse recurso.
Libraries
- android/customization
- android/image_capture
- android/maskType
- android/sensor_orientation_settings
- android/sensor_settings
- android/sensor_stability_settings
- android/settings
- android/video_capture
- caf_stage
- ios/customization
- ios/ios_resolution
- ios/sensor_stability_settings
- ios/settings
- message_settings
- passive_face_liveness
- result/passive_face_liveness_closed
- result/passive_face_liveness_failure
- result/passive_face_liveness_result
- result/passive_face_liveness_success
- show_preview