1. Introdução

A BCC Finger Photo é uma biblioteca Android feita para ser integrada à uma aplicação Android. Essencialmente, ela abrirá a câmera e capturará digitais para propósitos biométricos.

Esse manual está atualizado para a versão 4.3.0 da BCC Finger Photo.

1.1. Requisitos

A BCC Finger Photo é uma biblioteca de Android e deve ser importada no projeto-alvo.

  • Versão mínima do Android: Android 6.0 (SDK 23), “Marshmallow”
  • Versão mínima do Kotlin: 1.6.0.
  • O aparelho móvel deve possuir uma câmera.
  • O aplicativo nativo deve ser compilado com tecnologia Android.
  • Ambiente de desenvolvimento: Uma IDE Android é necessária, como o Android Studio (recomendado)
  • Dependências externas adicionais:

2. Instalação

2.1. Adicionando a Biblioteca no Projeto do App

A biblioteca BCC Finger Photo requer JNA para Android. Os dois são fornecidos pela Griaule como arquivos .aar.

Para adicionar as bibliotecas, acesse o diretório do seu projeto, abra a pasta app e crie os seguintes diretórios: libs/bccfinger. Em seguida, adicione as dependências jna.aar e bccfingerphotolib-release.aar. A estrutura de pastas deve ser semelhante a esta:

../../../_images/fingerFolderStructure1.png

A próxima etapa é tornar esses arquivos visíveis para as dependências do gradle. Para fazer isso, adicione a seguinte linha no arquivo build.gradle (:app) no objeto de dependências:

dependencies {
  [...]
  implementation fileTree(dir: 'libs/bccface', include: ['*.aar'])
}

Dentro do arquivo build.gradle (:app), adicione também as opções de compilação e defina a compatibilidade de origem e a compatibilidade de destino para usar 1.8 (Java 8).

compileOptions {
  sourceCompatibility = 1.8
  targetCompatibility = 1.8
}

2.2. Configurando as Dependências

Modifique o arquivo android/app/build.gradle:

dependencies {
  // YOUR DEPENDENCIES //
  ...

  // BCC FINGER //
  implementation fileTree(dir: 'libs/bccfinger', include:['*.aar'])

  // ANDROIDX //
  implementation 'androidx.appcompat:appcompat:1.1.0'
  implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
  implementation 'com.google.android.material:material:1.1.0'

  // LOTTIE //
  implementation 'com.airbnb.android:lottie:3.0.0'

  // CAMERA X //
  def camerax_version = "1.2.0-rc01"
  // CameraX core library using camera2 implementation
  implementation "androidx.camera:camera-camera2:$camerax_version"
  // CameraX Lifecycle Library
  implementation "androidx.camera:camera-lifecycle:$camerax_version"
  // CameraX View class
  implementation "androidx.camera:camera-view:$camerax_version"
}

3. Uso

3.1. Parâmetros e Construtor

Um uso simples da biblioteca é mostrado abaixo:

// To initialize a new capture
BCCFingerBuilder(this, this).initializeCapture()

O construtor da classe BCCFingerBuilder recebe os seguintes parâmetros:

  • context:Context - O contexto da aplicação.
  • delegate:BCCFingerDelegate - Interface responsável por notificar os eventos de captura, como falha ou sucesso.

A classe BCCFingerBuilder é responsável por gerenciar as configurações de uso do BCCFinger. Os parâmetros a seguir são aceitos para confiuração da captura biométrica e comportamento do software.

  • setSkipCaptureOption(enable: Boolean) - Habilita a opção de pular a captura atual.

  • setDebugMode(enable: Boolean) - Habilita o modo de debug.

  • buildCaptureType(type: [BCCFingerPhotoCaptureType]() - Define o tipo de captura de impressão digital. As opções são:

    enum class BCCFingerPhotoCaptureType {
        BOTH_HANDS,
        ONLY_LEFT_HAND,
        ONLY_RIGHT_HAND,
        THUMBS,
        LEFT_THUMB,
        RIGHT_THUMB,
        FULL_HANDS,
        FULL_LEFT_HAND,
        FULL_RIGHT_HAND;
    }
    
    • BOTH_HANDS - Ambas as mãos sem polegares.
    • ONLY_LEFT_HAND - Somente a mão esquerda, sem polegar.
    • ONLY_RIGHT_HAND - Somente a mão direita, sem polegar.
    • THUMBS - Ambos os polegares.
    • LEFT_THUMB - Somente polegar esquerdo.
    • RIGHT_THUMB - Somente polegar direito.
    • FULL_HANDS - Ambas as mãos com polegares.
    • FULL_LEFT_HAND - Somente a mão esquerda, com polegar.
    • FULL_RIGHT_HAND - Somente a mão direita, com polegar.
  • buildBeginDelaySeconds(delay: Float) - Define o delay para inciiar o ajuste automático do limiar.

  • buildThreshold - Define os parâmetros de limiar.

Para referência, a lista completa de parâmetros e valores padrão é:

skipsHandOption: Boolean = false
debugMode: Boolean = false
beginDelaySeconds: Float = 2f
maxQuality: Int = 50
minQuality: Int = 0
totalTime: Float = 20f
stepCount: Int = 20
captureType: BCCFingerPhotoCaptureType = BCCFingerPhotoCaptureType.FULL_HANDS

3.2. Valores de Retorno

Os resultados da última captura de impressão digital podem ser recuperados através do método fingerCaptureDidFinish da interface BCCFingerDelegate:

fun fingerCaptureDidFinish(
    returnData: BCCFingerReturnData,
    analytics: BCCFingerReturnAnalytics
)

O objeto returnData contém os seguintes métodos para recuperação dos dados:

  • getCapturedFingersIndexes() - Retorna uma lista com o índice de todas as impressões digitais capturadas:

    enum class BCCFingerIndex(val index: Int) {
        leftLittle(0),
        leftRing(1),
        leftMiddle(2),
        leftIndex(3),
        leftThumbs(4),
        rightThumbs(5),
        rightIndex(6),
        rightMiddle(7),
        rightRing(8),
        rightLittle(9);
    }
    
  • getCapturedFingers() - Retorna um mapa que relaciona os índices dos dedos com as biometrias capturadas.

  • getCapturedFingersData() - Retorna a lista de todas as impressões digitais capturadas:

    data class BCCFingerData(
        var fingerprintImage: Bitmap,
        var wsqAsBase64: String?
    )
    
    • fingerprintImage - Imagem PNG da impressão digital em escala de cinza.
    • wsqAsBase64 - Imagem da impressão digital em WSQ codificada em base64.
  • getSkippedFingers() - Retorna a lista de índices das capturas puladas.

A classe BCCFingerReturnData também contém atributos que armazenam a informação capturada agrupada por mão:

class BCCFingerReturnData {
    val leftHand: BCCHandData?
    val rightHand: BCCHandData?
}

Estes atributos podem ser nulos nos casos em não seja requerida captura para qualquer uma das mãos.

A classe HandData contém as seguintes informações:

var capturedFingers = mutableMapOf<BCCFingerIndex, BCCFingerData>()
private set

var skippedFingers = mutableListOf<BCCFingerIndex>()
private set

var handsPhoto: Bitmap? = null
private set

var thumbsPhoto: Bitmap? = null
private set
  • capturedFingers - Mapa que relaciona o índice do dedo à imagem da impressão digital.
  • skippedFingers - Lista de índices das capturas puladas.
  • handsPhoto - Foto original da mão que gerou as impressões digitais.
  • thumbPhoto - Foto original do polegar.

Caso o usuário encerre a aplicação antes de finalizar a captura bionmétrica, o método fingerCaptureDidAbort será chamado. Você pode implementar este método para tratar este cenário.

3.2.1. Recuperando as imagens originais

É possível recuperar as imgens originais através da classe BCCFingerReturnData, conforme mostrado abaixo:

val leftSlapPhoto = returnData.leftHand?.handsPhoto
val rightSlapPhoto = returnData.rightHand?.handsPhoto
val leftThumbPhoto = returnData.leftHand?.thumbsPhoto
val rightThumbPhoto = returnData.rightHand?.handsPhoto

3.3. Projeto Exemplo

Este é um exemplo de projeto funcional para captura de impressões digitais utilizando o BCC Finger Android:

package com.example.bccfignerexample

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.bccfignerexample.databinding.ActivityMainBinding
import com.griaule.bccfingerphotolib.analytics.   BCCFingerReturnAnalytics
import com.griaule.bccfingerphotolib.fingerApi.declaration.   BCCFingerBuilder
import com.griaule.bccfingerphotolib.fingerApi.declaration.   BCCFingerDelegate
import com.griaule.bccfingerphotolib.fingerApi.returnData.   BCCFingerReturnData


class MainActivity : AppCompatActivity(), BCCFingerDelegate {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setupListeners()
    }

    private fun setupListeners() {
        binding.startCaptureButton.setOnClickListener {    startCapture() }
    }

    private fun startCapture() {
        BCCFingerBuilder(this, this).initializeCapture()
    }

    override fun fingerCaptureDidAbort(
        analytics: BCCFingerReturnAnalytics
    ) {
        // ...
    }

    override fun fingerCaptureDidFinish(
        returnData: BCCFingerReturnData,
        analytics: BCCFingerReturnAnalytics
    ) {
        // ...
    }

}