@Override protected String getTitleText() { return getString(R.string.app_name); }
@Override public void run() { startActivity(new Intent(MainActivity.this, ScanActivity.class)); } });
@Override protected List<MenuListItem> createMenuListItems() { List<MenuListItem> items = new ArrayList<>(); items.add(buildSimpleIntegrationItem()); items.add(buildRegexExampleElement()); items.add(buildAdvancedIntegrationElement()); return items; }
private void showBackScanResults(Intent data) { mRecognizerBundle.loadFromIntent(data); String successFramePath = storeImageToFile(mSuccessFrameGrabberRecognizer.getResult().getSuccessFrame(), "successFrame.jpg"); String fullDocumentPath = storeImageToFile(mBackSideTemplatingUtil.getMRTDRecognizer().getResult().getFullDocumentImage(), "fullDocument.jpg"); String resultText = extractBackSideData(); if (mBackSideTemplatingRecognizer.getResult().getResultState() == Recognizer.Result.State.Valid) { startActivity(ResultsActivity.buildIntent(this, resultText, successFramePath, fullDocumentPath, "")); } }
private void showFrontScanResults(Intent data) { // now we can load bundle with scan results, after loading, results will be available // through recognizer instances mRecognizerBundle.loadFromIntent(data); String successFramePath = storeImageToFile(mSuccessFrameGrabberRecognizer.getResult().getSuccessFrame(), "successFrame.jpg"); String fullDocumentPath = storeImageToFile(mFrontSideTemplatingUtil.getFullDocumentImage().getResult().getRawImage(), "fullDocument.jpg"); String facePath = storeImageToFile(mFrontSideTemplatingUtil.getFaceImage().getResult().getRawImage(), "face.jpg"); String resultText = extractFrontSideData(); if (mFrontSideTemplatingRecognizer.getResult().getResultState() == Recognizer.Result.State.Valid) { startActivity(ResultsActivity.buildIntent(this, resultText, successFramePath, fullDocumentPath, facePath)); } }
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // onActivityResult is called whenever we are returned from activity started // with startActivityForResult. We need to check request code to determine // that we have really returned from BlinkID activity. if (requestCode != SCAN_ACTIVITY_REQ_CODE) { return; } // make sure BlinkID activity returned result if (resultCode == DocumentScanActivity.RESULT_OK && data != null) { recognizerBundle.loadFromIntent(data); storeHighResImage(data); // get images from recognizers and store them Recognizer firstRecognizer = recognizerBundle.getRecognizers()[0]; SuccessFrameGrabberRecognizer successFrameGrabberRecognizer = (SuccessFrameGrabberRecognizer) firstRecognizer; storeImage("successImage", successFrameGrabberRecognizer.getResult().getSuccessFrame()); //get wrapped recognizer MrtdRecognizer mrtdRecognizer = (MrtdRecognizer) successFrameGrabberRecognizer.getSlaveRecognizer(); storeImage("fullDocumentImage", mrtdRecognizer.getResult().getFullDocumentImage()); storeImage("mrzImage", mrtdRecognizer.getResult().getMrzImage()); Intent resultScreenIntent = new Intent(this, ResultActivity.class); recognizerBundle.saveToIntent(resultScreenIntent); startActivity(resultScreenIntent); } else { // if BlinkID activity did not return result, user has probably // pressed Back button and cancelled scanning Toast.makeText(this, "Scan cancelled!", Toast.LENGTH_SHORT).show(); } }
private String extractBackSideData() { StringBuilder sb = new StringBuilder(); addEntry(sb, R.string.PPAddress, mBackSideTemplatingUtil.getAddressParser().getResult().toString()); Date issueDate = mBackSideTemplatingUtil.getDateOfIssueParser().getResult().getDate().getDate(); if (issueDate != null) { addEntry(sb, R.string.PPIssueDate, formatDate(issueDate)); } addEntry(sb, R.string.PPIssuedBy, mBackSideTemplatingUtil.getIssuedByParser().getResult().toString()); //extract everything else from mrz result MrzResult mrzResult = mBackSideTemplatingRecognizer.getResult().getMrzResult(); addEntry(sb, R.string.PPPrimaryId, mrzResult.getPrimaryId()); addEntry(sb, R.string.PPSecondaryId, mrzResult.getSecondaryId()); addEntry(sb, R.string.PPSex, mrzResult.getGender()); addEntry(sb, R.string.PPNationality, mrzResult.getNationality()); return sb.toString(); }
private void storeHighResImage(Intent resultIntent) { // load high res image from result intent HighResImagesBundle highResImagesBundle = new HighResImagesBundle(resultIntent); // if high res image capture is disabled, images list will be empty // otherwise, we'll get 1 image per scanned document side List<HighResImageWrapper> highResImageWrappers = highResImagesBundle.getImages(); if (highResImageWrappers.isEmpty()) { return; } HighResImageWrapper highResImageWrapper = highResImageWrappers.get(0); String imagesFolderPath = createImagesFolder(); String imagePath = imagesFolderPath + "/highRes.jpg"; try { // optimal way to save high res image to file, // alternatively, you could get bitmap using highResImageWrapper.getImage().convertToBitmap() highResImageWrapper.saveToFile(new File(imagePath)); } catch (IOException e) { Log.e(LOG_TAG, "Failed to save image " + e.toString()); } // dispose image once you're done with it highResImageWrapper.dispose(); }
private String extractFrontSideData() { StringBuilder sb = new StringBuilder(); addEntry(sb, R.string.result_key_first_name, mFrontSideTemplatingUtil.getFirstNameParser().getResult().toString()); addEntry(sb, R.string.result_key_last_name, mFrontSideTemplatingUtil.getLastNameParser().getResult().toString()); // either new or old document number parser contains valid result (depends on the scanned document type) int documentNumberKeyResourceId = R.string.result_key_old_document_number; String documentNumber = mFrontSideTemplatingUtil.getOldDocumentNumberParser().getResult().toString(); if (documentNumber.isEmpty()) { documentNumber = mFrontSideTemplatingUtil.getNewDocumentNumberParser().getResult().toString(); documentNumberKeyResourceId = R.string.result_key_new_document_number; } addEntry(sb, documentNumberKeyResourceId, documentNumber); addEntry(sb, R.string.result_key_sex, mFrontSideTemplatingUtil.getSexParser().getResult().toString()); addEntry(sb, R.string.result_key_citizenship, mFrontSideTemplatingUtil.getCitizenshipParser().getResult().toString()); Date dateOfBirth = mFrontSideTemplatingUtil.getDateOfBirthParser().getResult().getDate().getDate(); if (dateOfBirth != null) { addEntry(sb, R.string.result_key_date_of_birth, formatDate(dateOfBirth)); } return sb.toString(); }
private void storeImage(String imageName, Image image) { String output = createImagesFolder(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); String dateString = dateFormat.format(new Date());
@Override protected String getTitleText() { return getString(R.string.app_name); }
/** * This method is invoked after returning from scan activity. You can obtain * scan results here */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode != MY_BLINKID_REQUEST_CODE) { return; } // make sure BlinkID activity returned result if (resultCode == CustomVerificationFlowActivity.RESULT_OK && data != null) { // set intent's component to ResultActivity and pass its contents // to ResultActivity. ResultActivity will show how to extract data from result. data.setComponent(new ComponentName(this, ResultActivity.class)); startActivity(data); } else { // if BlinkID activity did not return result, user has probably // pressed Back button and cancelled scanning Toast.makeText(this, "Scan cancelled!", Toast.LENGTH_SHORT).show(); } }
@Override protected String getTitleText() { return getString(R.string.app_name); }
@Override protected String getTitleText() { return getString(R.string.app_name); }
private void addEntry(StringBuilder stringBuilder, @StringRes int entryKeyResourceId, @NonNull String value) { stringBuilder.append(getString(entryKeyResourceId)).append(": ").append(value).append("\n"); }
private MenuListItem buildAdvancedIntegrationElement() { return new MenuListItem(getString(R.string.customUI), new Runnable() { @Override public void run() { startActivity(new Intent(MainActivity.this, ScanActivity.class)); } }); }
@Override protected List<MenuListItem> createMenuListItems() { List<MenuListItem> items = new ArrayList<>(); items.add(new MenuListItem(getString(R.string.scanMRTD), new Runnable() { @Override public void run() { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // request write permission ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE); } else { startScanning(); } } })); return items; }
@Override protected List<MenuListItem> createMenuListItems() { List<MenuListItem> items = new ArrayList<>(); items.add(new MenuListItem(getString(R.string.scan_croatian_id_front), new Runnable() { @Override public void run() { mFrontSideTemplatingRecognizer = mFrontSideTemplatingUtil.getDetectorRecognizer(); //wrapping into SuccessFrameGrabberRecognizer because we want to show successful scan image mSuccessFrameGrabberRecognizer = new SuccessFrameGrabberRecognizer(mFrontSideTemplatingRecognizer); startScanActivity(SCAN_FRONT_REQ_CODE); } })); items.add(new MenuListItem(getString(R.string.scan_croatian_id_back), new Runnable() { @Override public void run() { mBackSideTemplatingRecognizer = mBackSideTemplatingUtil.getMRTDRecognizer(); mSuccessFrameGrabberRecognizer = new SuccessFrameGrabberRecognizer(mBackSideTemplatingRecognizer); startScanActivity(SCAN_BACK_REQ_CODE); } })); return items; }
private MenuListItem buildSimpleIntegrationItem() { mTotalAmountParser = new AmountParser(); mTaxParser = new AmountParser(); mIbanParser = new IbanParser(); // we need to scan 3 items, so we will add 3 elements to bundle mSimpleFieldByFieldBundle= new FieldByFieldBundle( // each scan configuration contains two string resource IDs: // string shown in title bar and string shown in text field above scan box new FieldByFieldElement(R.string.amount_title, R.string.amount_msg, mTotalAmountParser), new FieldByFieldElement(R.string.tax_title, R.string.tax_msg, mTaxParser), new FieldByFieldElement(R.string.iban_title, R.string.iban_msg, mIbanParser) ); final FieldByFieldUISettings uiSettings = new FieldByFieldUISettings(mSimpleFieldByFieldBundle); uiSettings.setHelpIntent(new Intent(this, HelpActivity.class)); return new MenuListItem(getString(R.string.simple_integration), new Runnable() { @Override public void run() { ActivityRunner.startActivityForResult(MainActivity.this, SIMPLE_INTEGRATION_REQUEST_CODE, uiSettings); } }); }
private MenuListItem buildRegexExampleElement() { // now let's setup OCR engine parameters for scanning VIN: BlinkOCREngineOptions engineOptions = new BlinkOCREngineOptions(); // only uppercase chars and digits are allowed. Don't waste time on classifying other characters as we // do not need them. engineOptions.addAllDigitsToWhitelist(OcrFont.OCR_FONT_ANY).addUppercaseCharsToWhitelist(OcrFont.OCR_FONT_ANY); // do not bother with text lines that are smaller than 40 pixels engineOptions.setMinimumLineHeight(40); // we expect the VIN to be black text, so we can drop all colors from image - this will give better accuracy // because coloured text will be automatically discarded. engineOptions.setColorDropoutEnabled(true); // now let's create a RegexParser mVinParser = new RegexParser("[A-Z0-9]{17}", engineOptions); // same as in simple integration, create field by field bundle mVinFieldByFieldBundle = new FieldByFieldBundle ( new FieldByFieldElement(R.string.vin_title, R.string.vin_msg, mVinParser) ); final FieldByFieldUISettings uiSettings = new FieldByFieldUISettings(mVinFieldByFieldBundle); return new MenuListItem(getString(R.string.regex_example), new Runnable() { @Override public void run() { ActivityRunner.startActivityForResult(MainActivity.this, BLINK_OCR_VIN_REQUEST_CODE, uiSettings); } }); }