Search code examples
androidfingerprint

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?


Solution

  • 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