Flutter Biometric Finger
A powerful Flutter plugin for integrating NEXT Biometrics USB fingerprint scanners on Android.
This package provides a clean Flutter API for:
- Fingerprint image capture
- ISO template extraction
- Multi finger enrollment
- 1:1 verification flows
- Scanner lifecycle management
- PNG fingerprint preview rendering
Built for production grade biometric enrollment and verification workflows.
Features
- USB fingerprint scanner initialization
- ISO compliant fingerprint template extraction
- PNG fingerprint image generation
- Single finger verification
- Multi finger enrollment
- Real time quality metrics
- Finger spoof detection support
- Clean Flutter widget API
- Android native SDK integration using Kotlin
- Automatic SDK binary download during build
Supported Hardware
Tested Devices:
| Type | Model |
|---|---|
| NB65200U | AbeTree-ATS-24 |
Platform Support
| Platform | Support |
|---|---|
| Android | ✅ |
| iOS | ❌ |
| Web | ❌ |
| Windows | ❌ |
| macOS | ❌ |
| Linux | ❌ |
Minimum Android SDK: 24
Installation
Add dependency:
dependencies:
flutter_biometric_finger: ^0.0.1
Run:
flutter pub get
Android Configuration
Android 11+ Requirement
Add this attribute inside your AndroidManifest.xml application tag:
<application
android:name="${applicationName}"
android:label="your_app_name"
android:icon="@mipmap/ic_launcher"
android:allowNativeHeapPointerTagging="false">
This prevents crashes caused by legacy native biometric SDKs on Android 11+ devices.
💻 Usage
1. Initialize the Scanner
Before scanning, you must initialize the device.
import 'package:flutter_biomatric_finger/flutter_biomatric_finger.dart';
final scanner = FlutterBiomatricFinger();
final device = await scanner.initialize();
if (!device.found) {
print("Scanner not found: ${device.message}");
return;
}
print("Scanner initialized successfully!");
2. Scan and Extract Data
Once initialized, prompt the user to place their finger on the scanner and call scanAndExtract().
final scan = await scanner.scanAndExtract();
if (scan.status == 'success') {
print("Scan Quality: ${scan.quality}");
print("ISO Template (Base64): ${scan.templateBase64}");
} else {
print("Scan failed: ${scan.status}");
}
3. Display the Fingerprint Image
The plugin automatically converts the raw scanner data into a standard PNG format. You can easily display it using Flutter's Image.memory widget.
if (scan.imagePngBytes != null) {
Image.memory(scan.imagePngBytes!);
}
4. Dispose
Always dispose of the scanner when you are done to release the USB interface and free up memory.
await scanner.dispose();
Quick Start
Import package:
import 'package:flutter_biometric_finger/flutter_biometric_finger.dart';
Initialize Scanner
final controller = ScannerController();
await controller.initialize();
Single Finger Verification
final controller = ScannerController(
fingers: [Finger.rightThumb],
);
Right Hand Enrollment
final controller = ScannerController(
fingers: Finger.rightHand,
);
Custom Finger Selection
final controller = ScannerController(
fingers: const [
Finger.rightIndex,
Finger.leftIndex,
],
);
Scanner Widget
ScannerWidget(
controller: controller,
)
Scan Callback
ScannerWidget(
controller: controller,
onScanComplete: (result) {
debugPrint(result.templateBase64);
},
)
Full Example
import 'package:flutter/material.dart';
import 'package:flutter_biometric_finger/flutter_biometric_finger.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: ScannerPage(),
);
}
}
class ScannerPage extends StatefulWidget {
const ScannerPage({super.key});
@override
State<ScannerPage> createState() => _ScannerPageState();
}
class _ScannerPageState extends State<ScannerPage> {
late final ScannerController controller;
@override
void initState() {
super.initState();
controller = ScannerController(
fingers: [Finger.rightThumb],
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Fingerprint Scanner')),
body: ScannerWidget(
controller: controller,
onScanComplete: (result) {
debugPrint(
'Template length: ${result.templateBase64.length}',
);
},
),
);
}
}
Scan Result
Each completed scan returns:
result.templateBase64
result.imagePngBytes
result.quality
result.finger
result.spoofScore
result.scanMillis
Finger Presets
Available presets:
Finger.rightThumb
Finger.leftThumb
Finger.rightHand
Finger.leftHand
Finger.all
Or custom selection:
[
Finger.rightIndex,
Finger.leftIndex,
]
Example App
The package includes a fully functional example application demonstrating:
- All 10 finger capture
- Single finger verification
- Right hand enrollment
- Custom subset scanning
- Fingerprint preview rendering
- ISO template extraction
Run example:
cd example
flutter run
Troubleshooting
Scanner Not Found
Check:
- USB OTG is enabled
- Scanner is connected properly
- USB permission was granted
App Crashes During Scan
Verify:
android:allowNativeHeapPointerTagging="false"
is added inside the application tag.
Unsupported Device
Currently tested only with:
- NB65200U
- AbeTree-ATS-24
Other NEXT Biometrics devices may work but are not officially verified.
Architecture
This plugin uses:
- Flutter MethodChannel
- Native Android Kotlin integration
- AbeTree / NEXT Biometrics Android SDK
- USB host communication
- ISO fingerprint template extraction
License
BSD 3-Clause License
Libraries
- flutter_biometric_finger
- A Flutter Android plugin for NEXT Biometrics USB fingerprint scanners. Supports fingerprint image capture, ISO template extraction, multi-finger enrollment, 1:1 verification flows, and scanner lifecycle management.
- flutter_biometric_finger_method_channel
- flutter_biometric_finger_platform_interface