Leonardo Dias
Leonardo Dias

Reputation: 345

Android SDK for fingerprint matching - External device

I'm developing an Android application that uses U.are.U 4500 fingerprint reader to identify users. I already have a backend server, that uses SQL Server, to store and register user data and now I need my app to be able to read the user fingerprint and verify if this fingerprint matches any of the fingerprints on the database. Does anyone know a SDK that is able to do this comparison?

I'm using asia.kanopi.fingerscan package to read the user fingerprint and I already have the scan working, now I only need to get this image and compare to the data on the SQL database. I saw a few answers here on StackOverflow telling me to use openCV library for Android, but none of them could give me any lead on how to do it.

I based my development on this tutorial: https://medium.com/touch4it/fingerprint-external-scanner-with-usb-database-sdk-64c3ec5ea82d, but unfortunately I couldn't find the SDK IDKit Fingerprint SDK Mobile anywhere.

How can I sucessufully match the image with the one stored on the database?

Upvotes: 7

Views: 4025

Answers (2)

Leonardo Dias
Leonardo Dias

Reputation: 345

For those who are still looking for an answer to this problem. It's been a while since I actually implemented my solution and, when I did it, I added this line to my app gradle file:

com.github.lmone:SourceAFIS-Android:v3.4.0-fix3

But now I can't seem to find the github link anywhere. Maybe the repository got deleted. If someone find it, please send it to me so I can update my answer here.

Besides that, if you can still add the library to your Android project, the basic idea is to use a FingerprintMatcher to compare two FingerprintTemplate.

Example:

FingerprintTemplate probe = new FingerprintTemplate().dpi(500).create(digital_byte_array);

while (result.next()) {
    byte[] imgCandidate = digital_to_compare;
    FingerprintTemplate candidate = new FingerprintTemplate()
            .dpi(500)
            .create(imgCandidate);

    double score = new FingerprintMatcher()
            .index(probe)
            .match(candidate);

    if (score >= 40) {
        // Found a match
    }
}
            

In my case, I found the performance a little slow. It was usable, but nothing compared to Android's built-in fingerprint device. Also, the bigger your digitals collection, the longer it will take to find a match.

The score of the match is up for you to decide what suits better your project. 40 was a reliable amount in my case. The same goes to the FingerprintTemplate dpi.

Also, the method .create() receives a byte[] as parameter.

EDIT

I found this link and I'm almost certain it is the library I used, but under a new repository name:

https://github.com/robertvazan/sourceafis-java

The docs looks just the same as the code I used: https://sourceafis.machinezoo.com/java

Upvotes: 2

Related Questions