Skip to content

Commit bd559a5

Browse files
committed
Use Microblink recognizer without success frame grabber
1 parent ae04a27 commit bd559a5

File tree

10 files changed

+75
-93
lines changed

10 files changed

+75
-93
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ android {
1212
versionCode rootProject.generateVersionCode()
1313
versionName rootProject.generateVersionName()
1414
buildConfigField "String", "BLINK_LICENCE_KEY", "\"" + blink5LicenceKey + "\""
15+
buildConfigField "String", "BLINK_SUPPORTED_DOCUMENTS_URL", "\"https://github.com/BlinkID/blinkid-android/blob/master/documentation/BlinkIDRecognizer.md\""
1516
buildConfigField "String", "INTELLICHECK_URL", "\"https://dev.ver-id.com/id-check/parse-verify\""
1617
manifestPlaceholders = ["veridPassword": "8f821baf-4ae4-41cd-a175-91d7ef6a6db8"]
1718
}

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<application
1010
android:name=".CredentialsApplication"
1111
android:icon="@mipmap/ic_launcher"
12+
android:allowBackup="false"
1213
android:label="@string/app_name"
1314
android:supportsRtl="true"
1415
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">

app/src/main/java/com/appliedrec/credentials/app/DocumentData.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import android.os.Parcelable;
55

66
import com.microblink.entities.recognizers.blinkid.generic.BlinkIdCombinedRecognizer;
7-
import com.microblink.entities.recognizers.blinkid.usdl.UsdlCombinedRecognizer;
87

98
public class DocumentData implements Parcelable {
109

@@ -18,18 +17,6 @@ public class DocumentData implements Parcelable {
1817
private final String sex;
1918
private String rawBarcode;
2019

21-
public DocumentData(UsdlCombinedRecognizer.Result result) {
22-
firstName = result.getFirstName();
23-
lastName = result.getLastName();
24-
address = result.getAddress();
25-
dateOfBirth = result.getDateOfBirth().getOriginalDateString();
26-
dateOfExpiry = result.getDateOfExpiry().getOriginalDateString();
27-
dateOfIssue = result.getDateOfIssue().getOriginalDateString();
28-
documentNumber = result.getDocumentNumber();
29-
sex = result.getSex();
30-
rawBarcode = result.getRawStringData();
31-
}
32-
3320
public DocumentData(BlinkIdCombinedRecognizer.Result result) {
3421
firstName = result.getFirstName();
3522
lastName = result.getLastName();

app/src/main/java/com/appliedrec/credentials/app/MainActivity.java

Lines changed: 61 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@
1818
import com.appliedrec.verid.core.DetectedFace;
1919
import com.microblink.entities.recognizers.Recognizer;
2020
import com.microblink.entities.recognizers.RecognizerBundle;
21+
import com.microblink.entities.recognizers.blinkid.DataMatchResult;
2122
import com.microblink.entities.recognizers.blinkid.generic.BlinkIdCombinedRecognizer;
22-
import com.microblink.entities.recognizers.blinkid.usdl.UsdlCombinedRecognizer;
23-
import com.microblink.entities.recognizers.successframe.SuccessFrameGrabberRecognizer;
2423
import com.microblink.uisettings.ActivityRunner;
2524
import com.microblink.uisettings.BlinkIdUISettings;
2625

@@ -45,7 +44,7 @@ public class MainActivity extends RxVerIDActivity {
4544
protected void onCreate(Bundle savedInstanceState) {
4645
super.onCreate(savedInstanceState);
4746
setContentView(R.layout.activity_main);
48-
findViewById(R.id.button).setOnClickListener(v -> selectDocumentType());
47+
findViewById(R.id.button).setOnClickListener(v -> scanIDCard());
4948
progressBar = findViewById(R.id.progressBar);
5049
mainUIGroup = findViewById(R.id.mainUI);
5150
progressBar.setVisibility(View.VISIBLE);
@@ -86,102 +85,89 @@ public boolean onCreateOptionsMenu(Menu menu) {
8685

8786
@Override
8887
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
89-
if (item.getItemId() == R.id.about) {
90-
showAbout();
91-
return true;
92-
}
93-
if (item.getItemId() == R.id.settings) {
94-
showSettings();
95-
return true;
88+
switch (item.getItemId()) {
89+
case R.id.about:
90+
showAbout();
91+
return true;
92+
case R.id.settings:
93+
showSettings();
94+
return true;
95+
case R.id.supported_documents:
96+
showSupportedDocuments();
97+
return true;
9698
}
9799
return super.onOptionsItemSelected(item);
98100
}
99101

102+
private void showCardFromResult(BlinkIdCombinedRecognizer.Result result) {
103+
byte[] frontImage = result.getEncodedFrontFullDocumentImage();
104+
documentData = new DocumentData(result);
105+
addDisposable(Single.create(single -> {
106+
try {
107+
File imageFile = new File(getFilesDir(), "cardFront.jpg");
108+
FileOutputStream outputStream = new FileOutputStream(imageFile);
109+
ByteArrayInputStream inputStream = new ByteArrayInputStream(frontImage);
110+
int read;
111+
byte[] buffer = new byte[512];
112+
while ((read = inputStream.read(buffer, 0, buffer.length)) > 0) {
113+
outputStream.write(buffer, 0, read);
114+
}
115+
outputStream.close();
116+
inputStream.close();
117+
single.onSuccess(Uri.fromFile(imageFile));
118+
} catch (Exception e) {
119+
single.onError(e);
120+
}
121+
}).cast(Uri.class)
122+
.flatMapObservable(imageUri -> getRxVerID().detectRecognizableFacesInImage(imageUri, 1).map(face -> new DetectedFace(face, Bearing.STRAIGHT, imageUri)))
123+
.singleOrError()
124+
.subscribeOn(Schedulers.io())
125+
.observeOn(AndroidSchedulers.mainThread())
126+
.subscribe(
127+
this::showCard,
128+
this::showError
129+
));
130+
}
131+
100132
@Override
101133
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
102134
super.onActivityResult(requestCode, resultCode, data);
103135
if (requestCode == REQUEST_CODE_SCAN_ID_CARD && resultCode == RESULT_OK && data != null) {
104136
progressBar.setVisibility(View.VISIBLE);
105137
mainUIGroup.setVisibility(View.INVISIBLE);
106-
107138
recognizerBundle.loadFromIntent(data);
108-
109139
Recognizer firstRecognizer = recognizerBundle.getRecognizers()[0];
110-
SuccessFrameGrabberRecognizer successFrameGrabberRecognizer = (SuccessFrameGrabberRecognizer) firstRecognizer;
111-
112-
byte[] frontImage;
113140
documentData = null;
114-
if (successFrameGrabberRecognizer.getSlaveRecognizer() instanceof UsdlCombinedRecognizer) {
115-
UsdlCombinedRecognizer.Result result = ((UsdlCombinedRecognizer) successFrameGrabberRecognizer.getSlaveRecognizer()).getResult();
116-
frontImage = result.getEncodedFullDocumentImage();
117-
documentData = new DocumentData(result);
118-
} else if (successFrameGrabberRecognizer.getSlaveRecognizer() instanceof BlinkIdCombinedRecognizer) {
119-
BlinkIdCombinedRecognizer.Result result = ((BlinkIdCombinedRecognizer) successFrameGrabberRecognizer.getSlaveRecognizer()).getResult();
120-
frontImage = result.getEncodedFrontFullDocumentImage();
121-
documentData = new DocumentData(result);
122-
} else {
123-
return;
124-
}
125-
126-
addDisposable(Single.create(single -> {
127-
try {
128-
File imageFile = new File(getFilesDir(), "cardFront.jpg");
129-
FileOutputStream outputStream = new FileOutputStream(imageFile);
130-
ByteArrayInputStream inputStream = new ByteArrayInputStream(frontImage);
131-
int read;
132-
byte[] buffer = new byte[512];
133-
while ((read = inputStream.read(buffer, 0, buffer.length)) > 0) {
134-
outputStream.write(buffer, 0, read);
135-
}
136-
outputStream.close();
137-
inputStream.close();
138-
single.onSuccess(Uri.fromFile(imageFile));
139-
} catch (Exception e) {
140-
single.onError(e);
141+
if (firstRecognizer instanceof BlinkIdCombinedRecognizer) {
142+
BlinkIdCombinedRecognizer.Result result = ((BlinkIdCombinedRecognizer)firstRecognizer).getResult();
143+
if (result.getDocumentDataMatch() == DataMatchResult.Failed) {
144+
new AlertDialog.Builder(this)
145+
.setTitle(R.string.invalid_licence)
146+
.setMessage(R.string.front_and_back_dont_match)
147+
.setNegativeButton(android.R.string.cancel, null)
148+
.setPositiveButton(R.string.proceed_anyway, (dialogInterface, i) -> showCardFromResult(result))
149+
.create()
150+
.show();
151+
} else {
152+
showCardFromResult(result);
141153
}
142-
}).cast(Uri.class)
143-
.flatMapObservable(imageUri -> getRxVerID().detectRecognizableFacesInImage(imageUri, 1).map(face -> new DetectedFace(face, Bearing.STRAIGHT, imageUri)))
144-
.singleOrError()
145-
.subscribeOn(Schedulers.io())
146-
.observeOn(AndroidSchedulers.mainThread())
147-
.subscribe(
148-
this::showCard,
149-
this::showError
150-
));
154+
}
151155
} else if (requestCode == REQUEST_CODE_SHOW_SUPPORTED_DOCUMENTS) {
152-
selectDocumentType();
156+
scanIDCard();
153157
}
154158
}
155159

156-
private void selectDocumentType() {
157-
new AlertDialog.Builder(this)
158-
.setTitle(R.string.select_region)
159-
.setItems(new String[]{getString(R.string.north_america), getString(R.string.other)}, (dialogInterface, i) -> {
160-
Recognizer recognizer;
161-
if (i == 0) {
162-
recognizer = new UsdlCombinedRecognizer();
163-
((UsdlCombinedRecognizer)recognizer).setEncodeFullDocumentImage(true);
164-
} else {
165-
recognizer = new BlinkIdCombinedRecognizer();
166-
((BlinkIdCombinedRecognizer)recognizer).setEncodeFullDocumentImage(true);
167-
}
168-
SuccessFrameGrabberRecognizer successFrameGrabberRecognizer = new SuccessFrameGrabberRecognizer(recognizer);
169-
recognizerBundle = new RecognizerBundle(successFrameGrabberRecognizer);
170-
scanIDCard();
171-
})
172-
.setNegativeButton(android.R.string.cancel, null)
173-
.setPositiveButton(R.string.supported_documents, (dialogInterface, i) -> showSupportedDocuments())
174-
.create()
175-
.show();
176-
}
177-
178160
private void showSupportedDocuments() {
179161
Intent intent = new Intent(this, WebViewActivity.class);
180-
intent.putExtra(Intent.EXTRA_TEXT, "https://github.com/BlinkID/blinkid-android/blob/master/documentation/BlinkIDRecognizer.md");
162+
intent.putExtra(Intent.EXTRA_TEXT, BuildConfig.BLINK_SUPPORTED_DOCUMENTS_URL);
181163
startActivityForResult(intent, REQUEST_CODE_SHOW_SUPPORTED_DOCUMENTS);
182164
}
183165

184166
private void scanIDCard() {
167+
BlinkIdCombinedRecognizer recognizer = new BlinkIdCombinedRecognizer();
168+
recognizer.setReturnFullDocumentImage(true);
169+
recognizer.setEncodeFullDocumentImage(true);
170+
recognizerBundle = new RecognizerBundle(recognizer);
185171
BlinkIdUISettings uiSettings = new BlinkIdUISettings(recognizerBundle);
186172
uiSettings.enableHighResSuccessFrameCapture(true);
187173
ActivityRunner.startActivityForResult(this, REQUEST_CODE_SCAN_ID_CARD, uiSettings);

app/src/main/res/layout/activity_idcard.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
android:layout_width="wrap_content"
1111
android:layout_height="wrap_content"
1212
android:adjustViewBounds="true"
13+
android:contentDescription="@string/selfie"
1314
android:cropToPadding="false"
1415
android:maxHeight="200dp"
1516
android:scaleType="fitCenter"
@@ -22,6 +23,7 @@
2223
android:id="@+id/cardImageView"
2324
android:layout_width="240dp"
2425
android:layout_height="240dp"
26+
android:contentDescription="@string/your_id_card"
2527
app:layout_constraintBottom_toTopOf="@+id/button"
2628
app:layout_constraintEnd_toEndOf="parent"
2729
app:layout_constraintStart_toStartOf="parent"

app/src/main/res/layout/activity_main.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
android:layout_width="wrap_content"
3434
android:layout_height="wrap_content"
3535
android:scaleType="centerCrop"
36+
android:contentDescription="@string/woman_holding_id_card"
3637
app:layout_constraintBottom_toBottomOf="parent"
3738
app:layout_constraintEnd_toEndOf="parent"
3839
app:layout_constraintStart_toStartOf="parent"

app/src/main/res/layout/activity_settings.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
android:inputType="textPassword"
2020
app:layout_constraintEnd_toStartOf="@+id/button"
2121
app:layout_constraintStart_toStartOf="parent"
22-
app:layout_constraintTop_toTopOf="parent" />
22+
app:layout_constraintTop_toTopOf="parent"
23+
android:importantForAutofill="no" />
2324

2425
<ProgressBar
2526
android:id="@+id/progressBar"

app/src/main/res/menu/main.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
xmlns:app="http://schemas.android.com/apk/res-auto">
44
<item android:id="@+id/about" app:showAsAction="always" android:title="@string/about" />
55
<item android:id="@+id/settings" android:title="@string/settings" />
6+
<item android:id="@+id/supported_documents" android:title="@string/supported_documents" />
67
</menu>

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111
<string name="your_id_card">Your ID card</string>
1212
<string name="id_capture">ID capture</string>
1313
<string name="invalid_mb_key">Invalid Microblink licence key</string>
14-
<string name="select_region">Select issuing region</string>
15-
<string name="north_america">North America</string>
16-
<string name="other">Other</string>
1714
<string name="error">Error</string>
1815
<string name="face_comparison_failed">Face comparison failed</string>
1916
<string name="details">Details</string>
@@ -26,4 +23,9 @@
2623
<string name="intellicheck_api_key">Intellicheck API key</string>
2724
<string name="test">Test</string>
2825
<string name="about_intellicheck">Intellicheck verifies data from ID cards. Contact Applied Recognition for an API key.</string>
26+
<string name="front_and_back_dont_match">The front and the back of the licence don\'t seem to match.</string>
27+
<string name="invalid_licence">Invalid licence</string>
28+
<string name="proceed_anyway">Proceed anyway</string>
29+
<string name="selfie">Selfie</string>
30+
<string name="woman_holding_id_card">Woman holding ID card</string>
2931
</resources>

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ ext {
2222
blinkidVersion = '[5.0.0,6.0.0['
2323
veriduielementsVersion = '[1.0.0,2.0.0['
2424
versionMajor = 7
25-
versionMinor = 4
25+
versionMinor = 5
2626
versionPatch = 0
2727
versionClassifier = null
2828
versionClassifierVersion = ""

0 commit comments

Comments
 (0)