NEWSMRZ Scanner is now part of barKoder.What it means for you →

DOCUMENTATION

Installation guide

MRZ Scanner 1.x (archive) / Xamarin / Xamarin.Forms

Documentation / MRZ Scanner 1.x (archive) / Xamarin / Xamarin.Forms


1.Before we start to work in Portable (Shared) project we must to configure platform specific projects (Android and iOS):
 

1.1Android platform specific project
     - Copy MRZScannerDroidBinding.dll in your Android platform specific project

     - Add reference to MRZScannerDroidBinding.dll file in your Android platform specific project references

     - Create one layout.axml file and add the following code:
       (It is recommended that the scanner takes full screen.)

 

<fragment
   android:id="@+id/scannerFragment"
   android:name="com.scansolutions.mrzscannerlib.MRZScanner"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />


     - Create ViewRenderer that will help us to port our native fragment as control in portable project:

[assembly: ExportRenderer(typeof(MRZScannerForms.ScannerControl), typeof(MRZScannerForms.Droid.ScannerControlRenderer))]
namespace MRZScannerForms.Droid
{
        public class ScannerControlRenderer : ViewRenderer
        {
           public ScannerControlRenderer(Context context) : base(context) { }

           MRZScanner mrzScanner;

           protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.View> e)
           {
               base.OnElementChanged(e);

               if (e.OldElement != null || Element == null)
               {
                   return;
               }

               Android.Views.View _scannerLayout = ((FormsAppCompatActivity)Context).LayoutInflater.Inflate(Resource.Layout.scannerFragment, this, false);

               mrzScanner = (MRZScanner)((FormsAppCompatActivity)Context).SupportFragmentManager.FindFragmentById(Resource.Id.scannerFragment);
               MRZScanner.RegisterWithLicenseKey(Context, "licenseKey");

               if (Control == null)
                   SetNativeControl(_scannerLayout);
           }

           protected override void Dispose(bool disposing)
           {
               if (disposing)
               {
                   try
                   {
                       Fragment fragment = ((FormsAppCompatActivity)Context).SupportFragmentManager.FindFragmentById(Resource.Id.scannerFragment);

                       if (fragment != null)
                           ((FormsAppCompatActivity)Context).SupportFragmentManager.BeginTransaction().Remove(fragment).Commit();
                   }
                   catch (Exception e)
                   {
                       System.Diagnostics.Debug.WriteLine(e.Message);
                   }
                   mrzScanner = null;
               }

               base.Dispose(disposing);
           }
        }
}


     - Implement the IMRZScannerListener interface as a listener for a successful MRZ scan in MainActivity:

 

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IMRZScannerListener { …


1.2 iOS platform specific project


     - Copy MRZScanneriOSBinding.dll in your iOS platform specific project

     - Add reference to MRZScanneriOSBinding.dll file in your iOS platform specific project references

     - Create ViewRenderer that will help us to port our native fragment as control in portable project and implement IMRZScannerDelegate for a successful MRZ scan:

 

[assembly: ExportRenderer(typeof(MRZScannerForms.ScannerControl), typeof(MRZScannerForms.iOS.ScannerControlRenderer))]
namespace MRZScannerForms.iOS
{
        public class ScannerControlRenderer : ViewRenderer, IMRZScannerDelegate
        {
           MRZScannerController mrzSannerController;

           protected override void OnElementChanged(ElementChangedEventArgs<View> e)
           {
               base.OnElementChanged(e);

               if (e.OldElement != null || Element == null)
               {
                   return;
               }

               mrzSannerController = new MRZScannerController();
               MRZScannerController.RegisterLicenseWithKey("licenseKey");

               mrzSannerController.WeakDelegate = this;

               UIViewController currentViewController = UIApplication.SharedApplication.KeyWindow.RootViewController.NavigationController != null ? UIApplication.SharedApplication.KeyWindow.RootViewController.NavigationController : UIApplication.SharedApplication.KeyWindow.RootViewController;
               currentViewController.AddChildViewController(mrzSannerController);
               mrzSannerController.InitUI(currentViewController);

               if (Control == null)
                   SetNativeControl(mrzSannerController.View);
           }

           [Export("successfulScanWithResult:")]
           public void SuccessfulScanWithResult(MRZResultDataModel mrzResultDataModel)
           {
           }

           protected override void Dispose(bool disposing)
           {
               if (disposing)
               {
                   if (mrzSannerController != null)
                   {
                       mrzSannerController.CloseScanner();
                       mrzSannerController.Dispose();
                       mrzSannerController = null;
                   }
               }

               base.Dispose(disposing);
           }
        }
}


     - Add the following row in your Info.plist file:
       key: NSCameraUsageDescription
       value: MRZ Scanner requires using camera

 

 

 

 

 

  1. Now let’s go back in Portable project and create ScannerControl class that will inherit from Xamarin.Forms.View
    public class ScannerControl : Xamarin.Forms.View {
    }

    Here we can create bindable properties, event handlers, enums, etc. like we have in our sample applications.
     

  2. Use this custom control in you xamarin forms page where you want the scanner to be shown
    <ContentPage.Content>
       <!--It is recommended that the scanner takes fullscreen-->
       <local:ScannerControl x:Name="scannerControl" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />
    </ContentPage.Content>

     

Updated Apr 8, 2020 · Questions? Ask us