Android

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.

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:

Instalação

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:

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
}

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"
}

Uso

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

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.

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

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
	) {
		// ...
	}

}

Atualizado