Please find the Flutter repository here .
Installation and Licensing
Add the lines below in pubspec.yaml of the project you want to add the plugin to.
Copy ozsdk :
git :
url : https://gitlab.com/oz-forensics/oz-mobile-flutter-plugin.git
ref : '8.8.2'
Add the license file (e.g., license.json or forensics.license ) to the Flutter application/assets folder. In pubspec.yaml, specify the Flutter asset:
Copy assets
- assets/license.json // please note that the license file name must match to the one placed in assets
For Android, add the Oz repository to /android/build.gradle , allprojects → repositories section:
Copy allprojects {
repositories {
google()
mavenCentral()
maven { url ‘https://ozforensics.jfrog.io/artifactory/main’ } // repository URL
}
}
For Flutter 8.24.0 and above or Android Gradle plugin 8.0.0 and above, add to android/gradle.properties :
Copy android.nonTransitiveRClass=false
The minimum SDK version should be 21 or higher:
Copy defaultConfig {
...
minSDKVersion 21
...
}
For iOS, set the minimum platform to 13 or higher in the Runner → Info → Deployment target → iOS Deployment Target .
In ios/Podfile, comment the use_frameworks!
line (#use_frameworks!
).
Getting Started with Flutter
Initializing SDK
Initialize SDK by calling the init
plugin method. Note that the license file name and path should match the ones specified in pubspec.yaml (e.g., assets/license.json ).
Copy await OZSDK . initSDK ([ <% license path and license file name %> ]);
Connecting SDK to API
Use the API credentials (login, password, and API URL) that you’ve received from us.
Copy await OZSDK . setApiConnectionWithCredentials ( < login > , < password > , < host > );
In production, instead of hard-coding the login and password inside the application, it is recommended to get the access token on your backend via the API auth method, then pass it to your application:
Copy await OZSDK . setApiConnectionWithToken (token, host);
By default, logs are saved along with the analyses' data. If you need to keep the logs distinct from the analysis data, set up the separate connection for telemetry as shown below:
Copy await OZSDK . setEventsConnectionWithCredentials ( < login > , < password > , < host > );
or
Copy await OZSDK . setEventsConnectionWithToken ( < token > , < host > );
Capturing Videos
To start recording, use the startLiveness
method to obtain the recorded media:
Copy await OZSDK . startLiveness ( < actions > , < use_main_camera > );
Actions from the captured video
If True
, uses the main camera, otherwise the front one.
Please note: for versions 8.11 and below, the method name is executeLiveness
, and it returns the recorded media.
To obtain the media result, subscribe to livenessResult
as shown below:
Copy class Screen extends StatefulWidget {
static const route = 'liveness' ;
const Screen ({super.key});
@override
State < Screen > createState () => _ScreenState ();
}
class _ScreenState extends State < Screen > {
late StreamSubscription < List < Media >> _subscription;
@override
void initState () {
super. initState ();
// subscribe to liveness result
_subscription = OZSDK .livenessResult. listen (
( List < Media > medias) {
// media contains liveness media
},
onError : ( Object error) {
// handle error, in most cases PlatformException
},
);
}
@override
Widget build ( BuildContext context) {
// omitted to shorten the example
}
void _startLiveness () async {
// use startLiveness to start liveness screen
OZSDK . startLiveness ( < list of actions > );
}
@override
void dispose () {
// cancel subscription
_subscription. cancel ();
super. dispose ();
}
}
Checking Liveness and Face Biometry
To run the analyses, execute the code below.
Create the Analysis
object:
Copy List < Analysis > analysis = [ Analysis ( Type .quality, Mode .serverBased, < media > , {}), ];
Execute the formed analysis:
Copy final analysisResult = await OZSDK.analyze(analysis, [], {}) ?? [];
The analysisResult
list of objects contains the result of the analysis.
If you want to use media captured by another SDK, the code should look like this:
Copy media = Media ( FileTypedocumentPhoto , VerificationAction .oneShot, “photo_selfie”, null , < path to image > , null , null , “”)
The whole code block will look like this:
Liveness Biometry
Copy // replace VerificationAction.blank with your Liveness gesture if needed
final cameraMedia = await OZSDK . executeLiveness ([ VerificationAction .blank], use_main_camera);
final analysis = [
Analysis ( Type .quality, Mode .serverBased, cameraMedia, {}),
];
final analysisResult = await OZSDK . analyze (analysis, [], {});
Copy // replace VerificationAction.blank with your Liveness gesture if needed
final cameraMedia = await OZSDK . executeLiveness ([ VerificationAction .blank], use_main_camera);
final biometryMedia = [...cameraMedia];
biometryMedia. add (
Media (
FileType .documentPhoto,
VerificationAction .blank,
MediaType .movement,
null ,
< your reference image path > ,
null ,
null ,
MediaTag .photoSelfie,
),
);
final analysis = [
Analysis ( Type .quality, Mode .serverBased, cameraMedia, {}),
Analysis ( Type .biometry, Mode .serverBased, biometryMedia, {}),
];
final analysisResult = await OZSDK . analyze (analysis, [], {});