minds_digital 0.0.5
minds_digital: ^0.0.5 copied to clipboard
O SDK Flutter da Minds Digital busca proporcionar de forma rápida, simplificada e abstraída as jornadas de autenticação e cadastro por meio da biometria de voz em suas aplicações Flutter.
Minds Digital #
Configuração Android #
Ao executar no sistema Android, se você receber um erro indicando que minSdkVersion precisa ser 24.
tente adicionar o seguinte trecho ao arquivo <project_directory>/android/app/src/main/AndroidManifest.xml:
<manifest xmlns:tools="http://schemas.android.com/tools" ....... >
<uses-sdk tools:overrideLibrary="com.arthenica.ffmpegkit.flutter, com.arthenica.ffmpegkit" />
</manifest>
Configuração iOS #
Adicione a seguinte chave ao seu arquivo Info.plist, localizado em <project root>/ios/Runner/Info.plist:
<key>NSMicrophoneUsageDescription</key>
<string>Used to capture audio</string>
Using package #
In your Dart code, you can use:
import 'package:minds_digital/minds_digital.dart';
Getting Started #
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// Inicialize a SDK com o ambiente desejado (sandbox, staging ou production)
MindsApiWrapper.initialize(
environment: Environment.staging,
token:'token', // Substitua "token" pelo token de acesso fornecido para a integração com a API.
);
runApp(const AppWidget());
}
Utilização do Wrapper #
Criação de biometria de voz #
- Criar/atualizar uma biometria por voz para um cliente
Veja aqui os parâmetros que podem ser enviados na documentação oficial.
final response = await MindsApiWrapper.service.enrollment(
request: const BiometricsRequest(
audio: "SW4gY29tcHV0ZXIgcHJvZ3JhbW1pbmcsIEJhc2U2NCB",
cpf: '00000000000',
externalId: '123',
externalCustomerId: '123',
extension: 'ogg',
phoneNumber: '21981564763',
showDetails: true,
),
);
Autenticação #
- Validar o processo de biometria de voz de um cliente que já possui uma biometria por voz cadastrada.
Veja aqui os parâmetros que podem ser enviados na documentação oficial.
final response = await MindsApiWrapper.service.authentication(
request: const BiometricsRequest(
audio: "SW4gY29tcHV0ZXIgcHJvZ3JhbW1pbmcsIEJhc2U2NCB",
cpf: '00000000000',
externalId: '123',
externalCustomerId: '123',
extension: 'ogg',
phoneNumber: '21981564763',
showDetails: true,
),
);
Adição de um telefone na blocklist #
Veja aqui os parâmetros que podem ser enviados na documentação oficial.
final response = await MindsApiWrapper.service.setPhoneBlocklist(
request: const RequestPhoneBlocklist(
phoneNumber: '11111111111',
externalId: '123',
description: 'foi constatado uma fraude com esse número'
createdBy: 'Vitor',
),
);
Adição de uma voz na blocklist #
Veja aqui os parâmetros que podem ser enviados na documentação oficial.
final response = await MindsApiWrapper.service.setVoiceBlocklist(
request: const RequestVoiceBlocklist(
audio: "SW4gY29tcHV0ZXIgcHJvZ3JhbW1pbmcsIEJhc2U2NCB...",
externalId: '123',
description: 'foi constatado uma fraude com esse número',
createdBy: 'Vitor',
extension: 'ogg',
),
);
Verificação de biometria de voz #
- Verificar se um cliente já possui biometria de voz.
final response = await MindsApiWrapper.service.enrollmentVerify(cpf: "00000000000");
Certificação de biometria de voz #
- Adicionar um cliente na lista de clientes confiáveis
final response = await MindsApiWrapper.service.enrollmentCertify(cpf: "00000000000");
Componente de captura de áudio #
Renderização em forma de dialog #
FlowRecordAudio(
request: FlowRecordAudioRequest(
context: context,
biometricsRequest: const FlowBiometricsRequest(
cpf: '00000000000',
showDetails: true,
),
processType: ProcessType.authentication,
),
onResponse: (biometricsResponse) {
debugPrint("response $biometricsResponse");
},
onError: (error) {
debugPrint("error: $error");
},
style: const FlowStyle(),
).show(context); // Método .show() exibe o widget como dialog na tela
Classe de Estilização: FlowStyle
A classe FlowStyle é utilizada para definir o estilo e configurações visuais para a interface do widget FlowRecordAudio. Ela contém diversos parâmetros opcionais que permitem personalizar a aparência do componente de gravação de áudio e fluxo de biometria.
Propriedades #
A classe FlowStyle possui as seguintes propriedades:
-
title(String?): Uma string opcional que define o título da interface de gravação de áudio. -
subtitle(String?): Uma string opcional que define o subtítulo da interface de gravação de áudio. Esse subtítulo pode ser usado para fornecer informações adicionais ou instruções ao usuário. -
loadingColor(Color?): Uma cor opcional que define a cor de loding -
animationRecorderColor(Color?): Uma cor opcional que define a cor utilizada na animação de gravação de áudio. -
buttonColor(Color?): Uma cor opcional que define a cor de destaque do botão de gravação de áudio. -
fullScreenDialog(bool): Um valor booleano opcional que indica se a interface de gravação de áudio deve ser exibida como um diálogo em tela cheia (true) ou não (false). O valor padrão éfalse.
Exemplo de Uso #
Aqui está um exemplo de como utilizar a classe FlowStyle para personalizar a interface do widget FlowRecordAudio:
FlowRecordAudio(
request: FlowRecordAudioRequest(
biometricsRequest: biometricsRequest,
processType: processType,
context: context,
),
onResponse: (BiometricsResponse response) {
// Lidar com a resposta da biometria aqui
},
onError: (Exception error) {
// Lidar com os erros aqui
},
style: FlowStyle(
title: 'Gravação de Áudio',
subtitle: 'Pressione o botão para começar a gravar',
loadingColor: Colors.blue,
animationRecorderColor: Colors.red,
buttonColor: Colors.green,
fullScreenDialog: true,
),
)
Interface personalizada com Custom Builder #
O CustomBuilder é usado no widget FlowRecordAudio para permitir que a criação de uma interface personalizada para gravar áudio e lidar com os fluxos de biometria.
- Caso opte pela utilização do Custom Builder, não é necessário o uso do método show, visto que ele é utilizado apenas para renderizar um dialog padrão. Com o Custom Builder, você pode personalizar completamente a interface de gravação de áudio, incluindo a exibição em tela cheia ou em qualquer outra posição da tela.Caso opte pelo utilização do Custom Builder não é necessário a utilização do método show, visto que ele só é utilzado caso for para renderizar um dialog.
Assinatura #
typedef CustomBuilder = Widget Function(
BuildContext context,
RecordingState recordingState,
FlowBiometricsState flowBiometricsState,
Widget recordButton,
);
Parâmetros #
A função CustomBuilder retorna os seguintes parâmetros:
-
context(BuildContext): Um identificador para a localização de um widget na árvore de widgets. -
recordingState(RecordingState): Uma instância da classeRecordingState, que representa o estado atual da gravação de áudio. Isso inclui informações como a duração da gravação, se a gravação está ocorrendo atualmente. -
flowBiometricsState(FlowBiometricsState): Uma instância da classeFlowBiometricsState, que representa o estado atual do fluxo de biometria. Isso inclui informações como a resposta da frase aleatória e o estado geral do fluxo de biometria. -
recordButton(Widget): Um widget retornado que faz todo o processo de gravação, tratamento e envio de áudio para API. Ele é retornado noCustomBuildercomo um widget e pode ser utilizado em qualquer lugar da tela.
Esses parâmetros permitem que você crie uma interface personalizada de gravação de áudio com base no estado atual da gravação e no fluxo de biometria. O recordingState permite que você exiba informações relevantes sobre a gravação, como a duração atual. Já o flowBiometricsState permite que você mostre o estado atual do fluxo de biometria, incluindo detalhes sobre a frase aleatória. Além disso, o recordButton permite que você utilize o botão de gravação padrão para iniciar ou interromper a gravação de áudio.
Com esses parâmetros em mãos, você tem a flexibilidade para criar uma experiência de usuário personalizada e sob medida para a sua aplicação, ao mesmo tempo que utiliza a funcionalidade essencial de gravação de áudio e fluxo de biometria fornecida pelo widget FlowRecordAudio.
Exemplo #
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => FlowRecordAudio(
request: FlowRecordAudioRequest(
context: context,
biometricsRequest: const FlowBiometricsRequest(
cpf: '00000000000',
showDetails: true,
),
processType: ProcessType.authentication,
),
onResponse: (biometricsResponse) {
debugPrint("response $biometricsResponse");
},
onError: (error) {
debugPrint("error: $error");
},
style: const FlowStyle(),
customBuilder: (context, recordingState, flowBiometricsState, buttonRecord) => Scaffold(
appBar: AppBar(),
body: Builder(
builder: (context) {
if (flowBiometricsState.state is LoadingState) {
return const Center(
child: CircularProgressIndicator(),
);
}
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Center(
child: Text(
flowBiometricsState.randomSentence.sentence.text,
style: const TextStyle(
color: Colors.black,
),
textAlign: TextAlign.center,
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Visibility(
visible: recordingState.isRecording,
child: const Text(
'Gravando:',
style: TextStyle(color: Colors.red),
),
),
const SizedBox(width: 10),
_buildTimer(recordingState.recordDuration),
],
),
buttonRecord,
],
);
},
),
),
),
),
);