certiface_sdk 1.2.0 copy "certiface_sdk: ^1.2.0" to clipboard
certiface_sdk: ^1.2.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),
                ),
              ],
            ],
          ),
        ),
      ),
    );
  }
}
0
likes
140
points
168
downloads

Documentation

API reference

Publisher

verified publisheroititec.com.br

Weekly Downloads

SDK Flutter da Certiface para detecção de vida (liveness) e outras funcionalidades biométricas.

Repository (GitHub)
View/report issues

Topics

#biometric #liveness #camera #authentication

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on certiface_sdk

Packages that implement certiface_sdk