/// <summary>
        /// Button click event handler that will start the scanning procedure.
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="e">E.</param>
        void StartScan(object sender, EventArgs e)
        {
            // license keys must be set before creating Recognizer, othervise InvalidLicenseKeyException will be thrown
            // the following code creates and sets up implementation of MrtdRecognizer
            mrtdRecognizer = DependencyService.Get <IMrtdRecognizer>(DependencyFetchTarget.NewInstance);
            mrtdRecognizer.ReturnFullDocumentImage = true;

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            mrtdSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>(DependencyFetchTarget.NewInstance).CreateSuccessFrameGrabberRecognizer(mrtdRecognizer);

            // the following code creates and sets up implementation of UsdlRecognizer
            usdlRecognizer = DependencyService.Get <IUsdlRecognizer>(DependencyFetchTarget.NewInstance);

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            usdlSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>(DependencyFetchTarget.NewInstance).CreateSuccessFrameGrabberRecognizer(usdlRecognizer);

            // the following code creates and sets up implementation of EudlRecognizer
            eudlRecognizer = DependencyService.Get <IEudlRecognizer>(DependencyFetchTarget.NewInstance);
            eudlRecognizer.ReturnFaceImage         = true;
            eudlRecognizer.ReturnFullDocumentImage = true;

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            eudlSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>(DependencyFetchTarget.NewInstance).CreateSuccessFrameGrabberRecognizer(eudlRecognizer);

            // first create a recognizer collection from all recognizers that you want to use in recognition
            // if some recognizer is wrapped with SuccessFrameGrabberRecognizer, then you should use only the wrapped one
            var recognizerCollection = DependencyService.Get <IRecognizerCollectionFactory>().CreateRecognizerCollection(mrtdSuccessFrameGrabberRecognizer, usdlSuccessFrameGrabberRecognizer, eudlSuccessFrameGrabberRecognizer);

            // using recognizerCollection, create overlay settings that will define the UI that will be used
            // there are several available overlay settings classes in Microblink.Forms.Core.Overlays namespace
            // document overlay settings is best for scanning identity documents
            var documentOverlaySettings = DependencyService.Get <IDocumentOverlaySettingsFactory>().CreateDocumentOverlaySettings(recognizerCollection);

            // start scanning
            blinkID.Scan(documentOverlaySettings);
        }
        public BlinkIDPage()
        {
            InitializeComponent();

            // before obtaining any of the recognizer's implementations from DependencyService, it is required
            // to obtain instance of IMicroblinkScanner and set the license key.
            // Failure to do so will crash your app.
            var microblinkFactory = DependencyService.Get <IMicroblinkScannerFactory>();

            // license keys are different for iOS and Android and depend on iOS bundleID/Android application ID
            // in your app, you may obtain the correct license key for your platform via DependencyService from
            // your Droid/iOS projects
            string licenseKey;

            // both these license keys are demo license keys for bundleID/applicationID com.microblink.xamarin.blinkid
            if (Device.RuntimePlatform == Device.iOS)
            {
                licenseKey = "sRwAAAEeY29tLm1pY3JvYmxpbmsueGFtYXJpbi5ibGlua2lks3unDF2B9jpa6FeAx5h89osjSFXqQRtWjes0WSEXe3rubgFApHsFdSF2oJZL0MhSL18AgbaLmPiOT3RFu+lqtKtpsjqRfxEVmc9cU98GnjciEeAOC331OUeT5R1p7zKqsenX/3IytQJuMG4ruEaRXc5746y/Kv8ch0XDgv/nRu4siNlvpkjsUjkeyokbUUwi+uzL6t2G4V/sX0SXTMWPjG7zjtW4ovwpGs6fct/dpBJQfzRQNCn9kg==";
            }
            else
            {
                licenseKey = "sRwAAAAeY29tLm1pY3JvYmxpbmsueGFtYXJpbi5ibGlua2lke7qv4oIhH4ywlU8/ZIc8ttT74daTKaSlmN1khLj7e+CR+5SB1pjJQuNbEIlPAVl67d85JYqkRXxuWzKbaSWuPI7MzpKrXphakcSuyLYATcHaZMHh2rJvFFfYWXEWz6GZJSRk4TZmdqWBsjdNEJBe2F8hb/CEuKgkZkoESgLsCEYWf6Se+IkRBhRcmmOrcqJAf5YzhNbhlClR7GmNEPZheayI+i784TvIAnHFGloQF52KSF8YFm3dTw==";
            }

            // since DependencyService requires implementations to have default constructor, a factory is needed
            // to construct implementation of IMicroblinkScanner with given license key
            blinkID = microblinkFactory.CreateMicroblinkScanner(licenseKey);

            // license keys must be set before creating Recognizer, othervise InvalidLicenseKeyException will be thrown

            // the following code creates and sets up implementation of MrtdRecognizer
            mrtdRecognizer = DependencyService.Get <IMrtdRecognizer>();
            mrtdRecognizer.ReturnFullDocumentImage = true;

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            mrtdSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>().CreateSuccessFrameGrabberRecognizer(mrtdRecognizer);

            // the following code creates and sets up implementation of UsdlRecognizer
            usdlRecognizer = DependencyService.Get <IUsdlRecognizer>();

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            usdlSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>().CreateSuccessFrameGrabberRecognizer(usdlRecognizer);

            // the following code creates and sets up implementation of EudlRecognizer
            eudlRecognizer = DependencyService.Get <IEudlRecognizer>();
            eudlRecognizer.ReturnFaceImage         = true;
            eudlRecognizer.ReturnFullDocumentImage = true;

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            eudlSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>().CreateSuccessFrameGrabberRecognizer(eudlRecognizer);

            // subscribe to scanning done message
            MessagingCenter.Subscribe <Messages.ScanningDoneMessage> (this, Messages.ScanningDoneMessageId, (sender) => {
                ImageSource faceImageSource         = null;
                ImageSource fullDocumentImageSource = null;
                ImageSource successFrameImageSource = null;

                string stringResult = "No valid results.";

                // if user cancelled scanning, sender.ScanningCancelled will be true
                if (sender.ScanningCancelled)
                {
                    stringResult = "Scanning cancelled";
                }
                else
                {
                    // otherwise, one or more recognizers used in RecognizerCollection (see StartScan method below)
                    // will contain result

                    // if specific recognizer's result's state is Valid, then it contains data recognized from image
                    if (mrtdRecognizer.Result.ResultState == RecognizerResultState.Valid)
                    {
                        var result   = mrtdRecognizer.Result;
                        stringResult = "PrimaryID: " + result.MrzResult.PrimaryId + "\n" +
                                       "SecondaryID: " + result.MrzResult.SecondaryId + "\n" +
                                       "Nationality: " + result.MrzResult.Nationality + "\n" +
                                       "Gender: " + result.MrzResult.Gender + "\n" +
                                       "Date of birth: " + result.MrzResult.DateOfBirth.Day + "." + result.MrzResult.DateOfBirth.Month + "." + result.MrzResult.DateOfBirth.Year + ".";

                        fullDocumentImageSource = result.FullDocumentImage;
                        successFrameImageSource = mrtdSuccessFrameGrabberRecognizer.Result.SuccessFrame;
                    }

                    // similarly, we can check for results of other recognizers
                    if (usdlRecognizer.Result.ResultState == RecognizerResultState.Valid)
                    {
                        var result   = usdlRecognizer.Result;
                        stringResult =
                            "USDL version: " + result.GetField(UsdlKeys.StandardVersionNumber) + "\n" +
                            "Family name: " + result.GetField(UsdlKeys.CustomerFamilyName) + "\n" +
                            "First name: " + result.GetField(UsdlKeys.CustomerFirstName) + "\n" +
                            "Date of birth: " + result.GetField(UsdlKeys.DateOfBirth) + "\n" +
                            "Sex: " + result.GetField(UsdlKeys.Sex) + "\n" +
                            "Eye color: " + result.GetField(UsdlKeys.EyeColor) + "\n" +
                            "Height: " + result.GetField(UsdlKeys.Height) + "\n" +
                            "Street: " + result.GetField(UsdlKeys.AddressStreet) + "\n" +
                            "City: " + result.GetField(UsdlKeys.AddressCity) + "\n" +
                            "Jurisdiction: " + result.GetField(UsdlKeys.AddressJurisdictionCode) + "\n" +
                            "Postal code: " + result.GetField(UsdlKeys.AddressPostalCode) + "\n" +
                            // License information
                            "Issue date: " + result.GetField(UsdlKeys.DocumentIssueDate) + "\n" +
                            "Expiration date: " + result.GetField(UsdlKeys.DocumentExpirationDate) + "\n" +
                            "Issuer ID: " + result.GetField(UsdlKeys.IssuerIdentificationNumber) + "\n" +
                            "Jurisdiction version: " + result.GetField(UsdlKeys.JurisdictionVersionNumber) + "\n" +
                            "Vehicle class: " + result.GetField(UsdlKeys.JurisdictionVehicleClass) + "\n" +
                            "Restrictions: " + result.GetField(UsdlKeys.JurisdictionRestrictionCodes) + "\n" +
                            "Endorsments: " + result.GetField(UsdlKeys.JurisdictionEndorsementCodes) + "\n" +
                            "Customer ID: " + result.GetField(UsdlKeys.CustomerIdNumber);

                        successFrameImageSource = usdlSuccessFrameGrabberRecognizer.Result.SuccessFrame;
                    }

                    if (eudlRecognizer.Result.ResultState == RecognizerResultState.Valid)
                    {
                        var result   = eudlRecognizer.Result;
                        stringResult =
                            "First name: " + result.FirstName + "\n" +
                            "Last name: " + result.LastName + "\n" +
                            "Address: " + result.Address + "\n" +
                            "Personal number: " + result.PersonalNumber + "\n" +
                            "Driver number: " + result.DriverNumber;
                        successFrameImageSource = eudlSuccessFrameGrabberRecognizer.Result.SuccessFrame;
                        faceImageSource         = result.FaceImage;
                        fullDocumentImageSource = result.FullDocumentImage;
                    }
                }

                // updating the UI must be performed on main thread
                Device.BeginInvokeOnMainThread(() => {
                    resultsEditor.Text       = stringResult;
                    fullDocumentImage.Source = fullDocumentImageSource;
                    successScanImage.Source  = successFrameImageSource;
                    faceImage.Source         = faceImageSource;
                });
            });
        }
        private void InitializeBlinkIdScanner()
        {
            var microblinkFactory = DependencyService.Get <IMicroblinkScannerFactory>();

            string licenseKey = string.Empty;

            if (Device.RuntimePlatform == Device.iOS)
            {
                licenseKey = "sRwAAAEQY29tLmNobWwuaXQuY2Nmc0iUtoUk/ef1YJ5j3+j5toBM9aJu3EN0SDbB/mPKFx+V0MNFRZwwmNkzl1VU8JhdIYmouNK1poJKQCdOpB6MZ7W1x/pIarGykttt1FFrEHkvAE0NW8NEmidSg8mY+FCvJWVAiQlOHsSXw5YbyjtZv1lGDrU6zai0qefO7+VpwI3w2Q4GwlVybN7SlkSoU1vb8zh0y5Gc2eC5vVDyi7XoSZY/L1lUD1VsBWya5RBti4r7QzPEPy9M/WZp8TNJrw==";
            }
            else
            {
                licenseKey = "sRwAAAAeY29tLm1pY3JvYmxpbmsueGFtYXJpbi5ibGlua2lke7qv4oIhH4ywlU8/Zqc2tpXY3x6Jq4MYktFtYaRbzI3x0Qxrr0NeFEjL6qt8Qcz144x2F5LGg1bHXgkRXbt37saoFv1HJUiJ50Y4YHglH8SqhyfSzsT/C/vQEAKXgZBQuNeeCTY6RttMciEbHHHj7nybEz9+aOoBXfx0+XXx3cU4L6Wbmf/5EAXokQXtEkL3mCR8VC/51ohQVyRIgItohusasIcfe8B+UjUMCZU9v1B0bvHcUKZH6g==";
            }

            blinkID        = microblinkFactory.CreateMicroblinkScanner(licenseKey);
            mrtdRecognizer = DependencyService.Get <IMrtdRecognizer>();
            mrtdRecognizer.ReturnFullDocumentImage = true;

            mrtdSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>().CreateSuccessFrameGrabberRecognizer(mrtdRecognizer);


            // subscribe to scanning done message
            MessagingCenter.Subscribe <Microblink.Forms.Core.Messages.ScanningDoneMessage>(this, Microblink.Forms.Core.Messages.ScanningDoneMessageId, (sender) =>
            {
                string stringResult = "No valid results.";


                // if user cancelled scanning, sender.ScanningCancelled will be true
                if (sender.ScanningCancelled)
                {
                    stringResult = "Scanning cancelled";
                }
                else
                {
                    // if specific recognizer's result's state is Valid, then it contains data recognized from image
                    if (mrtdRecognizer.Result.ResultState == RecognizerResultState.Valid)
                    {
                        var result = mrtdRecognizer.Result;

                        ScanResult       = result.MrzResult;
                        SelectedIDMethod = Constants.IdentificationMethods.FirstOrDefault(x => x.Code == "2");

                        if (result.MrzResult.Gender == "F")
                        {
                            SelectedGender = Constants.Genders.FirstOrDefault(x => x.Gender == "Female");
                        }
                        else
                        {
                            SelectedGender = Constants.Genders.FirstOrDefault(x => x.Gender == "Male");
                        }


                        IsVisibleGuestInformation = true;
                        IsVisibleHint             = false;
                        IsVisiblePage             = true;

                        IsVisibleIndicator = false;
                        IsRunningIndicator = false;

                        //FullDocumentImge = result.FullDocumentImage;
                        //FrameImageSource = mrtdSuccessFrameGrabberRecognizer.Result.SuccessFrame;
                    }
                }
            });
        }
        public BlinkIDPage()
        {
            InitializeComponent();

            // before obtaining any of the recognizer's implementations from DependencyService, it is required
            // to obtain instance of IMicroblinkScanner and set the license key.
            // Failure to do so will crash your app.
            var microblinkFactory = DependencyService.Get <IMicroblinkScannerFactory>();

            // license keys are different for iOS and Android and depend on iOS bundleID/Android application ID
            // in your app, you may obtain the correct license key for your platform via DependencyService from
            // your Droid/iOS projects
            string licenseKey;

            // both these license keys are demo license keys for bundleID/applicationID com.microblink.xamarin.blinkid
            if (Device.RuntimePlatform == Device.iOS)
            {
                licenseKey = "sRwAAAEeY29tLm1pY3JvYmxpbmsueGFtYXJpbi5ibGlua2lks3unDF2B9jpa6FeAxSjaWUg1ROYBfuTUj5ciQyp9KpRtdClsjclAqYTT1BA7QMj6tUv6yIwdGZNSUhiR253O9Zugyv6tsc8hB9XvpMvDAHOiAmgzkj5SacPTjp5C4xZwKCmER2NUf4YSDddznrI7btd5cNnr0Bc5lT0wNHzlN7Z6r04dqoI+jzrCW65IgF8DrA/t4C6O0/lxthm+IfAmobL0kfI0ui6/fy3m8OZ31AacLKO1qb4T0A==";
            }
            else
            {
                licenseKey = "sRwAAAAeY29tLm1pY3JvYmxpbmsueGFtYXJpbi5ibGlua2lke7qv4oIhH4ywlU8/Zqc2tpXY3x6Jq4MYktFtYaRbzI3x0Qxrr0NeFEjL6qt8Qcz144x2F5LGg1bHXgkRXbt37saoFv1HJUiJ50Y4YHglH8SqhyfSzsT/C/vQEAKXgZBQuNeeCTY6RttMciEbHHHj7nybEz9+aOoBXfx0+XXx3cU4L6Wbmf/5EAXokQXtEkL3mCR8VC/51ohQVyRIgItohusasIcfe8B+UjUMCZU9v1B0bvHcUKZH6g==";
            }

            // since DependencyService requires implementations to have default constructor, a factory is needed
            // to construct implementation of IMicroblinkScanner with given license key
            blinkID = microblinkFactory.CreateMicroblinkScanner(licenseKey);

            // license keys must be set before creating Recognizer, othervise InvalidLicenseKeyException will be thrown

            // the following code creates and sets up implementation of MrtdRecognizer
            mrtdRecognizer = DependencyService.Get <IMrtdRecognizer>();
            mrtdRecognizer.ReturnFullDocumentImage = true;

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            mrtdSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>().CreateSuccessFrameGrabberRecognizer(mrtdRecognizer);

            // the following code creates and sets up implementation of UsdlRecognizer
            usdlRecognizer = DependencyService.Get <IUsdlRecognizer>();

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            usdlSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>().CreateSuccessFrameGrabberRecognizer(usdlRecognizer);

            // the following code creates and sets up implementation of EudlRecognizer
            eudlRecognizer = DependencyService.Get <IEudlRecognizer>();
            eudlRecognizer.ReturnFaceImage         = true;
            eudlRecognizer.ReturnFullDocumentImage = true;

            // success frame grabber recognizer must be constructed with reference to its slave recognizer,
            // so we need to use factory to avoid DependencyService's limitations
            eudlSuccessFrameGrabberRecognizer = DependencyService.Get <ISuccessFrameGrabberRecognizerFactory>().CreateSuccessFrameGrabberRecognizer(eudlRecognizer);

            // subscribe to scanning done message
            MessagingCenter.Subscribe <Messages.ScanningDoneMessage> (this, Messages.ScanningDoneMessageId, (sender) => {
                ImageSource faceImageSource         = null;
                ImageSource fullDocumentImageSource = null;
                ImageSource successFrameImageSource = null;

                string stringResult = "No valid results.";

                // if user cancelled scanning, sender.ScanningCancelled will be true
                if (sender.ScanningCancelled)
                {
                    stringResult = "Scanning cancelled";
                }
                else
                {
                    // otherwise, one or more recognizers used in RecognizerCollection (see StartScan method below)
                    // will contain result

                    // if specific recognizer's result's state is Valid, then it contains data recognized from image
                    if (mrtdRecognizer.Result.ResultState == RecognizerResultState.Valid)
                    {
                        var result   = mrtdRecognizer.Result;
                        stringResult = "PrimaryID: " + result.MrzResult.PrimaryId + "\n" +
                                       "SecondaryID: " + result.MrzResult.SecondaryId + "\n" +
                                       "Nationality: " + result.MrzResult.Nationality + "\n" +
                                       "Gender: " + result.MrzResult.Gender + "\n" +
                                       "Date of birth: " + result.MrzResult.DateOfBirth.Day + "." + result.MrzResult.DateOfBirth.Month + "." + result.MrzResult.DateOfBirth.Year + ".";

                        fullDocumentImageSource = result.FullDocumentImage;
                        successFrameImageSource = mrtdSuccessFrameGrabberRecognizer.Result.SuccessFrame;
                    }

                    // similarly, we can check for results of other recognizers
                    if (usdlRecognizer.Result.ResultState == RecognizerResultState.Valid)
                    {
                        var result   = usdlRecognizer.Result;
                        stringResult =
                            "USDL version: " + result.GetField(UsdlKeys.StandardVersionNumber) + "\n" +
                            "Family name: " + result.GetField(UsdlKeys.CustomerFamilyName) + "\n" +
                            "First name: " + result.GetField(UsdlKeys.CustomerFirstName) + "\n" +
                            "Date of birth: " + result.GetField(UsdlKeys.DateOfBirth) + "\n" +
                            "Sex: " + result.GetField(UsdlKeys.Sex) + "\n" +
                            "Eye color: " + result.GetField(UsdlKeys.EyeColor) + "\n" +
                            "Height: " + result.GetField(UsdlKeys.Height) + "\n" +
                            "Street: " + result.GetField(UsdlKeys.AddressStreet) + "\n" +
                            "City: " + result.GetField(UsdlKeys.AddressCity) + "\n" +
                            "Jurisdiction: " + result.GetField(UsdlKeys.AddressJurisdictionCode) + "\n" +
                            "Postal code: " + result.GetField(UsdlKeys.AddressPostalCode) + "\n" +
                            // License information
                            "Issue date: " + result.GetField(UsdlKeys.DocumentIssueDate) + "\n" +
                            "Expiration date: " + result.GetField(UsdlKeys.DocumentExpirationDate) + "\n" +
                            "Issuer ID: " + result.GetField(UsdlKeys.IssuerIdentificationNumber) + "\n" +
                            "Jurisdiction version: " + result.GetField(UsdlKeys.JurisdictionVersionNumber) + "\n" +
                            "Vehicle class: " + result.GetField(UsdlKeys.JurisdictionVehicleClass) + "\n" +
                            "Restrictions: " + result.GetField(UsdlKeys.JurisdictionRestrictionCodes) + "\n" +
                            "Endorsments: " + result.GetField(UsdlKeys.JurisdictionEndorsementCodes) + "\n" +
                            "Customer ID: " + result.GetField(UsdlKeys.CustomerIdNumber);

                        successFrameImageSource = usdlSuccessFrameGrabberRecognizer.Result.SuccessFrame;
                    }

                    if (eudlRecognizer.Result.ResultState == RecognizerResultState.Valid)
                    {
                        var result   = eudlRecognizer.Result;
                        stringResult =
                            "First name: " + result.FirstName + "\n" +
                            "Last name: " + result.LastName + "\n" +
                            "Address: " + result.Address + "\n" +
                            "Personal number: " + result.PersonalNumber + "\n" +
                            "Driver number: " + result.DriverNumber;
                        successFrameImageSource = eudlSuccessFrameGrabberRecognizer.Result.SuccessFrame;
                        faceImageSource         = result.FaceImage;
                        fullDocumentImageSource = result.FullDocumentImage;
                    }
                }

                // updating the UI must be performed on main thread
                Device.BeginInvokeOnMainThread(() => {
                    resultsEditor.Text       = stringResult;
                    fullDocumentImage.Source = fullDocumentImageSource;
                    successScanImage.Source  = successFrameImageSource;
                    faceImage.Source         = faceImageSource;
                });
            });
        }