Application to support biometric identification requirements for Medical Care Development International's campaign information management system for their Bioko Island campaigns (CIMS Bioko).
It is a blatant fork of OpenANDID cleaned up a bit and fixed for slightly older versions of Android. Notably, the fork removes support for VaxTrac and limits it focus to use with CommCare and ODK Collect. Also, the Bozorth binaries and libraries have been removed.
Scanning: Lumidigm Mercury 301-00 scanner is the only one supported. New scanners can be integrated by subclassing Scanner and providing usb instructions. USB Host mode is required of the Android Device. Android 4.4+ is supported.
Matching: OpenANDID Engine is a fork of SourceAFIS, optimized for android. Templates sent via intent must be in ISO format.
Once installed, you can communicate with the application via Intents. You must always include a unique sessionID with each intent call. We use this to deal with duplicate intent calls.
com.openandid.core.SCAN
call multiple scans with a single intent. Starting with 0 index add a "_n" to the end of each
key to group them together into screens of two scans.
InputKeys:
Inputs for the first scan:
sessionID: 00001
prompt_0 : A string scanning prompt for the user
left_finger_assignment_0 : Which finger you want in the left pane. Valid values are in the format hand_finger, i.e. "left_index" or "right_ring"
right_finger_assignment_0 : "
easy_skip_0 : Allows the user to leave the scanning screen without scanning both fingers. Values are "true" or "false"
Convention follows as "prompt_1" for the prompt on the second consecutive scanning screen.
ReturnKeys:
For the return, you'll get back extras labeled with the values for left and right finger assigments. For example, if you put "left_index" as your "left_finger_assignment_0" then you'll have a "left_index" key in the return bundle. The value of this is the fingerprint template as a hex string.
com.openandid.core.IDENTIFY
Try to identify a set of templates within the cached set. Returns the best matches which meet the score threshold.
InputKeys:
sessionID: unique session id
left_thumb : hex string of the template for the left thumb
right_thumb: "
left_index: "
right_index: "
max_matches : maximum number of matches to return
ReturnKeys:
matches_found: integer number of matches found
match_id_0 : uuid (case_id here) of best match
match_score_0 : score of best match
match_id_1: uuid of second best match
match_score_1: score of second best match
match_id_...
match_score_...
Returned scores and ids are limited by max_matches [max 10] or the number of matching records. If there are no matches, matches_found will return 0, but the other fields won't be populated.
com.openandid.core.PIPE
Chains together other API calls carrying along intermediate results until the final return. I.E. you can pipe SCAN results of 1 or more scanning screens directly into an IDENTIFY call. Requires all required keys not to be populated by intermediate actions to be passed initially.
InputKeys:
sessionID: unique session id
action_0: full qualified address of intent to be called (Limited to valid com.openandid namespace)
action_1: "
action_n
Other keys as needed for intents called in action.
Here's a .PIPE example for our current project that scans four fingers and passed them to identify. All outputs and inputs are passed back to the called on return.
Intent i = new Intent("com.openandid.core.PIPE");
i.putExtra("sessionID", "imauniqueid");
i.putExtra("action_0", "com.openandid.core.SCAN");
i.putExtra("action_1", "com.openandid.core.IDENTIFY")
i.putExtra("prompt_0", "Scan the Index Fingers")
i.putExtra("left_finger_assignment_0", "left_index");
i.putExtra("right_finger_assignment_0", "right_index");
i.putExtra("easy_skip_0", "false");
i.putExtra("prompt_0", "Scan the Thumbs");
i.putExtra("left_finger_assignment_1", "left_thumb");
i.putExtra("right_finger_assignment_1", "right_thumb");
i.putExtra("easy_skip_1", "false");