certiface_sdk 1.1.0
certiface_sdk: ^1.1.0 copied to clipboard
SDK Flutter da Certiface para detecção de vida (liveness) e outras funcionalidades biométricas.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:certiface_sdk/common/theme_builder.dart';
import 'package:certiface_sdk/certiface_sdk.dart';
import 'session_screen.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _certifaceSdk = CertifaceSdk();
UserData _userData = UserData();
String _appKey = '';
String _provider = 'FACETEC';
bool _isCustomEnabled = false;
bool _showInstructionScreen = true;
String _environment = 'HML';
String _livenessProvider = 'FACETEC';
String _checkPermResult = '';
String _askPermResult = '';
String _livenessResult = '';
Future<void> _checkPermission() async {
bool granted = false;
try {
granted = await _certifaceSdk.checkPermission();
} on PlatformException catch (e) {
_checkPermResult = 'Error: ${e.message}';
}
if (!mounted) return;
setState(() {
_checkPermResult = granted ? 'Permissão CONCEDIDA' : 'Permissão NEGADA';
});
}
Future<void> _askPermission() async {
bool granted = false;
try {
granted = await _certifaceSdk.askPermission();
} on PlatformException catch (e) {
_askPermResult = 'Error: ${e.message}';
}
if (!mounted) return;
setState(() {
_askPermResult =
granted ? 'Permissão AGORA CONCEDIDA' : 'Permissão AINDA NEGADA';
});
}
Future<void> _startLiveness() async {
final appKey = _appKey.trim();
if (appKey.isEmpty) {
setState(() {
_livenessResult =
'App Key não configurada. Vá em Credenciais para gerar.';
});
return;
}
Map<String, dynamic> res = {};
try {
res = await _certifaceSdk.startLiveness(
appKey,
environment: _environment,
provider: _livenessProvider,
isCustomEnabled: _isCustomEnabled,
theme: _isCustomEnabled ? _themeCustomization().toJson() : null,
);
} on PlatformException catch (e) {
_livenessResult = 'Error: ${e.message}';
if (mounted) setState(() {});
return;
}
if (!mounted) return;
setState(() {
if (res['status'] == 'success') {
_livenessResult = 'Liveness OK: ${res['result']}';
} else {
_livenessResult = 'Liveness ERRO: ${res['message']}';
}
});
}
ThemeBuilder _themeCustomization() {
return ThemeBuilder()
.setTitle("Verificação Facial Personalizada")
.setTitleColor("#FFFFFF")
.setHeaderBackgroundColor("#1A1A1A")
.setPromptTextColor("#FFFFFF")
.setPromptBackgroundColor("#2A2A2A")
.setSurroundColor("#00FF88")
.setFontResource(0)
.setIsEnabledScreenShots(true)
.setDisableExteriorEffects(true)
.setTimeoutSecs(90)
.setPromptRoundedCorners(true)
.setFilter("Natural", "CLEAR")
.setOrientation(gpa: "PORTRAIT", la: "PORTRAIT")
.setCamera("FRONT")
.setOvalColors(
ready: 0xFF00FF88,
notReady: 0xFFFF4444,
stroke: 0xFFFFFFFF,
completed: 0xFF00FF88)
.setInstructionsTheme((builder) => builder
.setTitleText("Instruções Personalizadas")
.setTitleColor("#FFFFFF")
.setCaptionText("Siga as instruções para completar a verificação.")
.setCaptionColor("#CCCCCC")
.setBackgroundColor("#2A2A2A")
.setBottomSheetColor("#3A3A3A")
.setDocumentTipsInstructionText("Dicas personalizadas")
.setDocumentTypesInstructionText("Tipos de documento aceitos")
.setBottomSheetCornerRadius(20.0)
.setContinueButtonText("Iniciar Verificação")
.setContinueButtonColor("#00FF88")
.setContinueButtonTextColor("#000000")
.setShowInstructionScreen(_showInstructionScreen)
.setStatusBarColor("#1A1A1A")
.setStatusBarIsDarkIcons(false)
.setTitleFont("sixty")
.setCaptionFont("sixty")
.setFirstInstructionTitleFont("sixty")
.setSecondInstructionTitleFont("sixty")
.setContinueButtonFont("sixty")
.setBackButtonIconAsset("shell")
.setContextImageAsset("shell")
.setFirstInstructionIconAsset("shell")
.setSecondInstructionIconAsset("shell"))
.setPermissionTheme((builder) => builder
.setTitle("Permissões Necessárias")
.setTitleColor("#FFFFFF")
.setBackgroundColor("#2A2A2A")
.setCheckPermissionButtonText("Permitir Acesso à Câmera")
.setCheckPermissionButtonStyle("#00FF88")
.setStatusBarColor("#2A2A2A")
.setStatusBarIsDarkIcons(false)
.setTitleFont("sixty")
.setCaptionFont("sixty")
.setCheckPermissionButtonFont("sixty")
.setBackButtonIconAsset("back_icon")
.setCameraImageAsset("camera_icon"))
.setProcessingTheme((builder) => builder
.setBackgroundColor("#000000")
.setLoadingDialogColor("#FFFFFF")
.setLoadingIndicatorSize(120)
.setLoadingIndicatorWidth(12)
.setStatusBarColor("#000000")
.setStatusBarIsDarkIcons(true))
.setResultTheme((builder) => builder
.setSuccessBackgroundColor("#E8F5E8")
.setSuccessIcon("success_icon")
.setSuccessText("Verificação concluída com sucesso!")
.setSuccessTextColor("#2E7D32")
.setErrorBackgroundColor("#FFEBEE")
.setErrorIcon("error_icon")
.setErrorText("Falha na verificação. Tente novamente.")
.setErrorTextColor("#C62828")
.setRetryButtonColor("#00FF88")
.setRetryButtonText("Tentar Novamente")
.setRetryButtonTextColor("#000000")
.setStatusBarSuccessColor("#E8F5E8")
.setStatusBarErrorColor("#FFEBEE")
.setStatusBarSuccessIsDarkIcons(true)
.setStatusBarErrorIsDarkIcons(true)
.setTextFont("sixty")
.setRetryButtonFont("sixty"))
.setIproovTheme((builder) => builder
.setTitleText("Verificação Facial Personalizada")
.setTitleColor("#FFFFFF")
.setHeaderBackgroundColor("#1A1A1A")
.setPromptTextColor("#FFFFFF")
.setPromptBackgroundColor("#2A2A2A")
.setSurroundColor("#00FF88")
.setInstructionsTitleFont("sixty")
.setInstructionsCaptionFont("sixty")
.setResultMessageFont("sixty")
.setResultRetryButtonFont("sixty")
.setLogoImageAsset("logo")
.setCloseButtonIconAsset("close_icon"));
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Oiti SDK Demo',
home: Scaffold(
appBar: AppBar(
title: const Text('Oiti SDK Example'),
actions: [
Builder(
builder: (context) => TextButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute<void>(
builder: (context) => SessionScreen(
userData: _userData,
appKey: _appKey,
provider: _provider,
onUserDataChanged: (data) =>
setState(() => _userData = data),
onAppKeyChanged: (key) => setState(() {
_appKey = key;
_livenessProvider = _provider;
}),
onProviderChanged: (provider) => setState(() {
_provider = provider;
_livenessProvider = provider;
_appKey = '';
}),
),
),
);
},
child: const Text('Credenciais'),
),
),
],
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Container(
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration(
color: Colors.grey.shade100,
borderRadius: BorderRadius.circular(8),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('App Key:'),
Text(
_appKey.isNotEmpty ? 'Configurada' : 'Não configurada',
style: TextStyle(
fontWeight: FontWeight.w600,
color: _appKey.isNotEmpty ? Colors.green : Colors.red,
),
),
],
),
),
const SizedBox(height: 16),
DropdownButtonFormField<String>(
value: _environment,
decoration: const InputDecoration(
labelText: 'Environment',
border: OutlineInputBorder(),
),
items: ['HML', 'PRD']
.map((e) => DropdownMenuItem(value: e, child: Text(e)))
.toList(),
onChanged: (v) => setState(() => _environment = v ?? 'HML'),
),
const SizedBox(height: 8),
DropdownButtonFormField<String>(
value: _livenessProvider,
decoration: const InputDecoration(
labelText: 'Provider',
border: OutlineInputBorder(),
),
items: ['IPROOV', 'FACETEC']
.map((e) => DropdownMenuItem(value: e, child: Text(e)))
.toList(),
onChanged: (v) =>
setState(() => _livenessProvider = v ?? 'IPROOV'),
),
const SizedBox(height: 16),
SwitchListTile(
title: const Text('Custom Enabled'),
subtitle: Text(_isCustomEnabled ? 'True' : 'False'),
value: _isCustomEnabled,
onChanged: (val) {
setState(() {
_isCustomEnabled = val;
});
},
),
if (_isCustomEnabled) ...[
const SizedBox(height: 8),
SwitchListTile(
title: const Text('Exibir tela de instruções'),
subtitle: Text(
_showInstructionScreen ? 'Sim' : 'Não (pular tela)',
),
value: _showInstructionScreen,
onChanged: (val) {
setState(() {
_showInstructionScreen = val;
});
},
),
],
const SizedBox(height: 24),
ElevatedButton(
onPressed: _checkPermission,
child: const Text('Check Camera Permission'),
),
if (_checkPermResult.isNotEmpty) ...[
const SizedBox(height: 8),
Text(_checkPermResult),
],
const SizedBox(height: 16),
ElevatedButton(
onPressed: _askPermission,
child: const Text('Ask Camera Permission'),
),
if (_askPermResult.isNotEmpty) ...[
const SizedBox(height: 8),
Text(_askPermResult),
],
const SizedBox(height: 16),
ElevatedButton(
onPressed: _appKey.isEmpty ? null : _startLiveness,
child: const Text('Start Liveness'),
),
if (_livenessResult.isNotEmpty) ...[
const SizedBox(height: 8),
Text(
_livenessResult,
style: const TextStyle(fontWeight: FontWeight.bold),
),
],
],
),
),
),
);
}
}